2014-02-06 36 views
3

我有2個數組。 「A」是其中的一個具有任意長度(假設1000個條目的一個開始),其中每個點保持Ñ維向量,其中每個條目表示標量。 「B」是另一個,其中n各自保持三維向量的條目。我怎樣才能做一個標量乘法,這樣的結果是一個數組「C」,其中每個條目是每個ñ標量與每個ñ 3維向量的標量乘?特殊向量和元素乘法

如4- d的示例:

a=[[1,2,3,4],[5,6,7,8],....] 
    b=[[1,0,0],[0,1,0],[0,0,1],[1,1,1]] 

和結果

c=[[1*[1,0,0],2*[0,1,0],3*[0,0,1],4*[1,1,1]] , [5*[1,0,0],...],...] 

實現應該是在numpy的,但無大的for循環,因爲有預期比方式更1000個條目。 n在我們的例子中預計爲7。

+2

請認真閱讀請注意'numpy.array'和'list'的用法。這些是不同的數據結構。例如'np.array([0,1,0])* 2'產生'np.array([0,2,0])',而'[0,1,0] * 2'產生' [0,1,0,0,1,0]'。 – Akavall

回答

3

如果你開始:

a = np.array([[1,2,3,4],[5,6,7,8]]) 
b = np.array([[1,0,0],[0,1,0],[0,0,1],[1,1,1]]) 

然後,我們可以添加一個額外的軸a,並重復陣列沿着它給我們......

>>> a[:,:,None].repeat(3, axis=2) 
array([[[1, 1, 1], 
     [2, 2, 2], 
     [3, 3, 3], 
     [4, 4, 4]], 

     [[5, 5, 5], 
     [6, 6, 6], 
     [7, 7, 7], 
     [8, 8, 8]]]) 

現在,@Jaime說,因爲NumPy的廣播處理它,所以在操作時不需要使用repeat

>>> a[:,:,None] * b 
array([[[1, 0, 0], 
     [0, 2, 0], 
     [0, 0, 3], 
     [4, 4, 4]], 

     [[5, 0, 0], 
     [0, 6, 0], 
     [0, 0, 7], 
     [8, 8, 8]]]) 
+1

你不需要'repeat',廣播就會處理它,即'a [...,None] * b'讓你變得一樣,只會更快。 – Jaime

+0

是的...我使用'repeat'只是爲了找出正確的軸來添加並忘記刪除它。 –

+0

美麗而容易......謝謝。我們試着用'重複'來解決問題,但是添加軸的簡單想法卻沒有出現。 – Dschoni