这是我的目标,使用Python Numpy:
我想创建一个(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.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:要明确,我想拍一个3D点产品。也就是说,对于矢量A =(a1,a2,a3) 和B =(b1,b2,b3),
点积应
dotproduct(A,B)= a1b1 + a2b2 + a3b3。
答案 0 :(得分: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
答案 1 :(得分:0)
所以,你最初的想法并不遥远。连接数组所涉及的开销非常小,但如果您对numpy
内部的内容感兴趣,那么内置的一组函数vstack
, hstack
和dstack
应完全按照您的意愿执行。 (分别为垂直,水平和深度)
我会留给你确定你在哪里,但这里有一个从文档中无耻地窃取的例子,以帮助你入门:
>>> 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 docs和dstack docs
如果在这里有三个独立的功能感觉有点过分,那么你就是对的!这就是为什么numpy
也具有concatenate
功能的原因。它只是vstack
,hstack
和dstack
的一般化,它采用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]])