所以我试图使用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
会更优化吗?
答案 0 :(得分:2)
您不能使用两个n * m
矩阵的点积,除非m == n
- 当两个矩阵A和B相乘时,B需要包含与A一样多的列。 (所以你可以将n * m
矩阵与m * n
矩阵相乘。)
答案 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.])