2015-04-22 55 views
1

大維矩陣這是我的目標,使用Python numpy的:Python中,創建的3維點積

我想創建點積值的(1000,1000)二維陣列/矩陣。這意味着每個陣列/矩陣條目是矢量1到1000的點積。構造這在理論上是簡單的:一個定義了矢量v1,v2,...,v1000的(1​​,1000)維矩陣

import numpy as np 
vectorvalue = np.matrix([v1, v2, v3, ..., v1000]) 

並採取與所述轉置的點積,即

matrix_of_dotproducts = np.tensordot(vectorvalue.T, vectorvalue) 

和陣列的形狀和/矩陣將是(1000,1000)。 (1,1)項將是矢量(v1,v1)的點積,(1,2)項將是矢量(v1,v2)的點積等。爲了計算點積numpy的三維向量,這是明智的使用numpy.tensordot()而不是numpy.dot()

這是我的問題:我沒有開始向量值的數組。我以每個座標值的三個1000個元素數組開始,即x座標,y座標和z座標的數組。

xvalues = np.array([x1, x2, x3, ..., x1000]) 
yvalues = np.array([y1, y2, y3, ..., y1000]) 
zvalues = np.array([z1, z2, z3, ..., z1000]) 

是做構建(3,1000)numpy的陣列/矩陣,然後採取張量積對於每一對最容易的事?

v1 = np.array([x1,y1,z1]) 
v2 = np.array([x2,y2,z2]) 
... 

我敢肯定有一個更聽話的和有效的方式做到這一點...

PS:要清楚,我想借此三維積。即,對於載體

A =(A1,A2,A3) 和B =(B1,B2,B3),

點積應該是

dotproduct(A,B)= a1b1 + a2b2 + a3b3。

回答

0

IIUC,你可以建立中間陣列如你所說:

>>> arr = np.vstack([xvalues, yvalues, zvalues]).T 
>>> out = arr.dot(arr.T) 

這似乎是你想要什麼:

>>> out.shape 
(1000, 1000) 
>>> out[3,4] 
1.193097281209083 
>>> arr[3].dot(arr[4]) 
1.193097281209083 
+0

或稍微更緊湊:'ARR = np.array([xvalues,yvalues,zvalues]); out = arr.T.dot(arr)' – hpaulj

0

所以,你並不遙遠你最初的想法。連接陣列的開銷很小,但如果您有興趣在numpy之內執行操作,則可以使用一組內置函數vstackhstackdstack,這些函數應該按照您的意願執行。 (立式,臥式,分別深度)

我會讓你來確定你在哪裏,但這裏是一個從文檔無恥地竊取一個例子來幫助你開始:

>>> a = np.array([1, 2, 3]) 
>>> b = np.array([2, 3, 4]) 
>>> np.vstack((a,b)) 
array([[1, 2, 3], 
     [2, 3, 4]]) 

作爲參考:vstack docs,hstack docsdstack docs

如果它感覺有點過於頂部有三個獨立的功能,那麼你是對的!這就是爲什麼numpy也有concatenate功能。這只是vstack,hstackdstack的推廣,它需要axis參數。

>>> a = np.array([[1, 2], [3, 4]]) 
>>> b = np.array([[5, 6]]) 
>>> np.concatenate((a, b), axis=0) 
array([[1, 2], 
     [3, 4], 
     [5, 6]]) 

Concatenate docs

+0

我不確定如何「回答問題」。你們都同時迴應。我討厭StackOverflow的這個特性......應該有一種方法來了解這兩個評論者。謝謝你!偉大的和翔實的答案! – ShanZhengYang