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

Python, creating a large-dimensional matrix of 3-dimensional dot products

这是我的目标,使用 Python Numpy:

我想创建一个 (1000,1000) 维的 array/matrix 点积值。这意味着每个 array/matrix 条目都是向量 1 到 1000 的点积。构建它在理论上很简单:定义一个 (1,1000) 维向量矩阵 v1, v2, ..., v1000

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

并用转置取点积,即

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

array/matrix 的形状将为 (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 array/matrix 然后为每对取张量点积是最简单的事情吗?

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

我相信有一种更容易处理和更有效的方法来做到这一点...

PS:说清楚,我想取一个3D点积。也就是说,对于向量

A = (a1, a2, a3) B = (b1, b2, b3),

点积应该是

点积(A,B) = a1b1 + a2b2 + a3b3。

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

所以,您与最初的想法相去不远。连接数组的开销很小,但如果您有兴趣在 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 docs, and dstack 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