如何计算numpy中的张量收缩?

如何计算numpy中的张量收缩?,numpy,Numpy,我在numpy中有一个张量a,它是n1x。。x Nn x M1 x。。。x毫米和一个张量B,即m1x。。。x毫米。如何计算A和B的张量收缩C,应该是n1x。。。xnn?我试着对 np.tensordot(A, B, ...) 但我对它不是很熟悉 例如,如果A是一个nxm矩阵和B一个M-向量,我可以只做np.dot(A,B),但我不确定如何推广这一点 In [78]: A=np.arange(2*3*4*5).reshape(2,3,4,5) In [79]: B=np.arange(4*5).

我在numpy中有一个张量
a
,它是
n1x。。x Nn x M1 x。。。x毫米
和一个张量
B
,即
m1x。。。x毫米
。如何计算
A
B
的张量收缩
C
,应该是
n1x。。。xnn?
我试着对

np.tensordot(A, B, ...)
但我对它不是很熟悉

例如,如果
A
是一个
nxm
矩阵和
B
一个
M
-向量,我可以只做
np.dot(A,B)
,但我不确定如何推广这一点

In [78]: A=np.arange(2*3*4*5).reshape(2,3,4,5)
In [79]: B=np.arange(4*5).reshape(4,5)

In [81]: np.einsum('...ij,ij',A,B)
Out[81]: 
array([[ 2470,  6270, 10070],
       [13870, 17670, 21470]])

In [82]: np.tensordot(A,B,((2,3),(0,1)))
Out[82]: 
array([[ 2470,  6270, 10070],
       [13870, 17670, 21470]])
tensordot
使用整形(和轴交换)将问题减少到二维,
dot
可以处理:

In [83]: A1=A.reshape(2*3,4*5)
In [84]: B1=B.reshape(4*5)
In [85]: C1=np.dot(A1,B1)
In [86]: C1.reshape(2,3)
Out[86]: 
array([[ 2470,  6270, 10070],
       [13870, 17670, 21470]])
如果总体尺寸过大,因此数组大小过大,
einsum
将出现内存问题。嗯,两者都可以

虽然
..
可以处理数量可变的
N
维度,但我们必须明确
M
维度。(理论上,我们可以通过编程方式构造
ij
字符串。)

tensordot
使用整形(和轴交换)将问题减少到二维,
dot
可以处理:

In [83]: A1=A.reshape(2*3,4*5)
In [84]: B1=B.reshape(4*5)
In [85]: C1=np.dot(A1,B1)
In [86]: C1.reshape(2,3)
Out[86]: 
array([[ 2470,  6270, 10070],
       [13870, 17670, 21470]])
如果总体尺寸过大,因此数组大小过大,
einsum
将出现内存问题。嗯,两者都可以


虽然
..
可以处理数量可变的
N
维度,但我们必须明确
M
维度。(理论上,我们可以通过编程来构造一个
ij
字符串。)

为了充分的灵活性和威力,您可以尝试使用。为了充分的灵活性和威力,您可以尝试使用。您是如何发现可以通过重塑将张量收缩转换为矩阵乘法的?我在谷歌搜索答案时遇到困难。
张量收缩
在numpy中不是常见的描述。所以网络搜索也没用。我从你的例子和维度——以及
einsum
的经验中学习。你是如何通过重塑将张量收缩转化为矩阵乘法的?我在谷歌搜索答案时遇到困难。
张量收缩
在numpy中不是常见的描述。所以网络搜索也没用。我是根据您的示例和维度工作的,以及使用
einsum
的经验。