Python 用nx1阵列计算nxn阵列阵列的点积
鉴于: 我想用A中的2x2阵列和B中的2x1阵列来计算两个阵列之间的点积,所以我想做的是:Python 用nx1阵列计算nxn阵列阵列的点积,python,arrays,numpy,Python,Arrays,Numpy,鉴于: 我想用A中的2x2阵列和B中的2x1阵列来计算两个阵列之间的点积,所以我想做的是: A = np.array([[[10, -1], [-1, 10]], [[30, 4], [5, 10]]]) B = np.array([[[5],[2]], [[3],[4]]]) 结果是: res = dot(A, B) 或者更容易: res = [[[48],[15]],[
A = np.array([[[10, -1],
[-1, 10]],
[[30, 4],
[5, 10]]])
B = np.array([[[5],[2]],
[[3],[4]]])
结果是:
res = dot(A, B)
或者更容易:
res = [[[48],[15]],[[106],[55]]]
但我知道我的数组A
相当长,因此A.shape
是mx2x2x2
,而我的数组B
的长度总是相等的,即B.shape
是mx2x1
m
可以是任何值,例如250000
我尝试了
np.tensordot
,但无法正确配置轴以获得我想要的结果。如何执行嵌套数组的点积?使用numpy有两种方法进行矩阵乘法:
1) 两个阵列的点积
res = [[48, 15], [106, 55]]
输出:
np.dot(A,B)
np.multiply(A,B)
2) 元素乘法(哈达玛乘积):
输出:
np.dot(A,B)
np.multiply(A,B)
matmul
,@
设计用于对“批次”执行dot
,如下所示:
In [60]: A = np.array([[[10, -1],
...: [-1, 10]],
...: [[30, 4],
...: [5, 10]]])
...: B = np.array([[[5],[2]],
...: [[3],[4]]])
In [61]: A
Out[61]:
array([[[10, -1],
[-1, 10]],
[[30, 4],
[ 5, 10]]])
In [62]: A.shape
Out[62]: (2, 2, 2)
In [63]: B.shape
Out[63]: (2, 2, 1)
einsum
也可以工作
In [64]: A@B
Out[64]:
array([[[ 48],
[ 15]],
[[106],
[ 55]]])
np.dot
对未求和的维度执行外积:
In [65]: np.einsum('mij,mjl->mil',A,B)
Out[65]:
array([[[ 48],
[ 15]],
[[106],
[ 55]]])
可以从对角线中提取所需的结果,但速度较慢,因为它实际上会丢弃一半的结果:
In [66]: np.dot(A,B).shape
Out[66]: (2, 2, 2, 1)
你能解释一下你是如何得到预期结果中的值的吗?我假设48
是10*5+(-1)*2
,但是-25
是从哪里来的呢?对不起,我没有正确计算,它应该是15(-1*5+2*10)
我想你可能只需要A@B
(或者np.matmul(A,B)
),也就是[[48]、[15]、[106]、[55]
,但是74
和另一个-25
似乎也算错了。谢谢!这就正确地解决了问题。再次道歉,是的,这似乎是错误的,我理解,但我问的是嵌套在数组中的数组,如果你提到我最初的问题,我可以澄清,如果需要的话。
In [68]: np.dot(A,B)[range(2),:,range(2),:]
Out[68]:
array([[[ 48],
[ 15]],
[[106],
[ 55]]])