Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NumPy Tensordot轴=2_Numpy_Tensordot - Fatal编程技术网

NumPy Tensordot轴=2

NumPy Tensordot轴=2,numpy,tensordot,Numpy,Tensordot,我知道有很多关于tensordot的问题,我已经浏览了15页的迷你书中的一些答案,我确信这些答案是人们花了好几个小时才做出的,但我还没有找到关于axes=2的解释 这使我想到np.tensordot(b,c,axes=2)==np.sum(b*c),但作为一个数组: b = np.array([[1,10],[100,1000]]) c = np.array([[2,3],[5,7]]) np.tensordot(b,c,axes=2) Out: array(7532) 但后来失败了: a =

我知道有很多关于tensordot的问题,我已经浏览了15页的迷你书中的一些答案,我确信这些答案是人们花了好几个小时才做出的,但我还没有找到关于
axes=2
的解释

这使我想到
np.tensordot(b,c,axes=2)==np.sum(b*c)
,但作为一个数组:

b = np.array([[1,10],[100,1000]])
c = np.array([[2,3],[5,7]])
np.tensordot(b,c,axes=2)
Out: array(7532)
但后来失败了:

a = np.arange(30).reshape((2,3,5))
np.tensordot(a,a,axes=2)
如果有人能对
np.tensordot(x,y,axes=2)
提供一个简短的解释,并且只提供
axes=2
,那么我很乐意接受

In [70]: a = np.arange(24).reshape(2,3,4)
In [71]: np.tensordot(a,a,axes=2)
Traceback (most recent call last):
  File "<ipython-input-71-dbe04e46db70>", line 1, in <module>
    np.tensordot(a,a,axes=2)
  File "<__array_function__ internals>", line 5, in tensordot
  File "/usr/local/lib/python3.8/dist-packages/numpy/core/numeric.py", line 1116, in tensordot
    raise ValueError("shape-mismatch for sum")
ValueError: shape-mismatch for sum
这是在第一个
a
的最后两个维度和第二个
a
的前两个维度上进行双轴压缩。使用此
a
表示尺寸不匹配。显然,这个
是为2d阵列设计的,而没有太多考虑3d阵列。这不是一个三轴减速

一些开发人员认为这些单位数的轴值是方便的,但这并不意味着它们是经过严格考虑或测试的

元组轴为您提供了更多控制:

In [74]: np.tensordot(a,a,axes=[(0,1,2),(0,1,2)])
Out[74]: array(4324)
In [75]: np.tensordot(a,a,axes=[(0,1),(0,1)])
Out[75]: 
array([[ 880,  940, 1000, 1060],
       [ 940, 1006, 1072, 1138],
       [1000, 1072, 1144, 1216],
       [1060, 1138, 1216, 1294]])

请链接到你读过的迷你书。我也读过其中一些,我们要么没有读到同一个,要么你有一些具体的问题,你无法清楚地表达出来。我在一段时间前探讨了这些单位数字轴的动作。它们被转换成元组形式,然后进行
dot
调用。我认为理解这一点并不重要
np.einsum
matmul
是对
dot
的更有用的扩展。您所说的“失败”是什么意思?@hpaulj,
np.tensordot(a,a,axes=2)
给出了
提升值错误(“求和形状不匹配”)
可能的重复,谢谢。我现在明白了。不过,我不会说它不适用于高维阵列。现在我看到,
axes=N
要求第一个数组的最后N维与第二个数组的前N维相同,顺序相同。因此,使用
a=np.arange(720).重塑(2,3,4,5,6)
b=np.arange(720).重塑(5,6,8,3)
,和
c=np.arange(720).重塑(4,5,6,1,6)
,你可以做
np.tensordot(a,b,axes=2)
np.tensordot(a,c,axes=3)
。我最初认为
axes=2
是一个选项,而不是
axes=N
是必须匹配的维度数。
In [74]: np.tensordot(a,a,axes=[(0,1,2),(0,1,2)])
Out[74]: array(4324)
In [75]: np.tensordot(a,a,axes=[(0,1),(0,1)])
Out[75]: 
array([[ 880,  940, 1000, 1060],
       [ 940, 1006, 1072, 1138],
       [1000, 1072, 1144, 1216],
       [1060, 1138, 1216, 1294]])