Python-采用长列表数组的点积

时间:2016-09-08 02:31:59

标签: python numpy

所以我试图使用numpy的点积函数来获取两个数组的点积。

import numpy as np

MWFrPos_Hydro1 = subPos1[submaskFirst1]
x = MWFrPos_Hydro1
MWFrVel_Hydro1 = subVel1[submaskFirst1]
y = MWFrVel_Hydro1
MWFrPosMag_Hydro1 = [np.linalg.norm(i) for i in MWFrPos_Hydro1]

np.dot(x, y)

返回

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-135-9ef41eb4235d> in <module>()
      6 
      7 
----> 8 np.dot(x, y)

ValueError: shapes (1220,3) and (1220,3) not aligned: 3 (dim 1) != 1220 (dim 0)

我使用此功能不正确?

数组看起来像这样

print x

[[  51.61872482  106.19775391   69.64765167]
 [  33.86419296   11.75729942   11.84990311]
 [  12.75009823   58.95491028   38.06708527]
 ..., 
 [  99.00266266   96.0210495    18.79844856]
 [  27.18083954   74.35041809   78.07577515]
 [  19.29788399   82.16114044    1.20453501]]

print y

[[  40.0402298  -162.62153625 -163.00158691]
 [-359.41983032 -115.39328766   14.8419466 ]
 [  95.92044067 -359.26425171  234.57330322]
 ..., 
 [ 130.17840576   -7.00977898   42.09699249]
 [  37.37852478  -52.66002655 -318.15155029]
 [ 126.1726532   121.3104248  -416.20855713]]

在这种情况下,循环np.vdot会更优化吗?

2 个答案:

答案 0 :(得分:2)

您不能使用两个n * m矩阵的点积,除非m == n - 当两个矩阵A和B相乘时,B需要包含与A一样多的列。 (所以你可以n * m矩阵与m * n矩阵相乘。)

this article on multiplying matrices

答案 1 :(得分:2)

(n,3)数组的一些可能产品(此处我只是一个)

In [434]: x=np.arange(12.).reshape(4,3)
In [435]: x
Out[435]: 
array([[  0.,   1.,   2.],
       [  3.,   4.,   5.],
       [  6.,   7.,   8.],
       [  9.,  10.,  11.]])

元素乘积元素,在列之间求和; n值。这是一个数字大小。

In [436]: (x*x).sum(axis=1)
Out[436]: array([   5.,   50.,  149.,  302.])

einsum相同,它可以更好地控制哪些轴相乘,哪些轴相加。

In [437]: np.einsum('ij,ij->i',x,x)
Out[437]: array([   5.,   50.,  149.,  302.])

dot要求第二个的第一个和第二个的最后一个具有相同的大小,所以我必须使用x.T(转置)。对角线与上述相符。

在[438]中:np.dot(x,x.T)     出[438]:     数组([[5.,14.,23.,32。],            [14.,50.,86。,122。],            [23.,86。,149。,212。],            [32.,122。,212。,302。]])

np.einsum('ij,kj',x,x)做同样的事情。

有一个新的matmul产品,但是像这样的2d数组只有dot。我必须将它们变成3d数组以获得4个值;即便如此,我还要挤出多余的尺寸:

In [450]: x[:,None,:]@x[:,:,None]
Out[450]: 
array([[[   5.]],

       [[  50.]],

       [[ 149.]],

       [[ 302.]]])
In [451]: np.squeeze(_)
Out[451]: array([   5.,   50.,  149.,  302.])