1

这是我的目标,使用 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 用于三维向量,明智的做法是使用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),

点积应该是

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

4

2 回答 2

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
于 2015-04-22T01:51:02.550 回答
0

因此,您与最初的想法相距不远。连接数组的开销很小,但如果您有兴趣在 inside 中进行numpy操作,则有一组内置函数 , vstackhstack并且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 docshstack docsdstack docs

如果在这里拥有三个独立的功能感觉有点过头了,那么你是对的!所以numpy也有这个concatenate功能。它只是 , 的概括vstackhstack并且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]])

连接文档

于 2015-04-22T01:51:17.150 回答