如何计算numpy中的张量收缩?
我在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).
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
的经验。