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
内执行操作,则有一组内置函数,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, and 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]])
这是我的目标,使用 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
内执行操作,则有一组内置函数,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, and 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]])