Python,创建一个三维点积的大维矩阵

时间:2015-04-22 01:38:05

标签: python arrays numpy matrix dot-product

这是我的目标,使用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。

2 个答案:

答案 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内部的内容感兴趣,那么内置的一组函数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 docshstack docsdstack docs

如果在这里有三个独立的功能感觉有点过分,那么你就是对的!这就是为什么numpy也具有concatenate功能的原因。它只是vstackhstackdstack的一般化,它采用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