numpy.tensordot

numpy.tensordot(a, b, axes=2)[源代码]

沿指定轴计算张量点积。

给定两个张量, ab 以及包含两个数组类对象的数组类对象, (a_axes, b_axes) ,求和 a S和 b 的元素(组件)位于由指定的轴上 a_axesb_axes . 第三个参数可以是单个非负整数类标量, N ;如果是这样,那么最后一个 N 尺寸 a 第一 N 尺寸 b 总结。

参数
a, barray_like

张量到“点”。

axesint或(2,)数组类似
  • 整数,如int n,和 a 和的前n个轴 b 整齐。相应轴的大小必须匹配。

  • (2,)数组或,要求和的轴列表,应用于 a 第二 b . 两个元素数组的长度必须相同。

返回
output恩达雷

输入的张量积。

参见

dot, einsum

笔记

三个常见的用例是:
  • axes = 0 : tensor product a\otimes b

  • axes = 1 : tensor dot product a\cdot b

  • axes = 2 : (default) tensor double contraction a:b

什么时候? axes 是整数形式的,计算的顺序为:首先是中的第n个轴 a 零轴 b 和-1th轴 a 第n轴 b 最后。

当有多个轴需要求和时-它们不是 a (b )-参数 axes 应该由两个长度相同的序列组成,第一个轴在两个序列中首先求和,第二个轴在第二个序列中求和,依此类推。

结果的形状由第一张量的非收缩轴和第二张量的非收缩轴组成。

实例

一个“传统”的例子:

>>> a = np.arange(60.).reshape(3,4,5)
>>> b = np.arange(24.).reshape(4,3,2)
>>> c = np.tensordot(a,b, axes=([1,0],[0,1]))
>>> c.shape
(5, 2)
>>> c
array([[4400., 4730.],
       [4532., 4874.],
       [4664., 5018.],
       [4796., 5162.],
       [4928., 5306.]])
>>> # A slower but equivalent way of computing the same...
>>> d = np.zeros((5,2))
>>> for i in range(5):
...   for j in range(2):
...     for k in range(3):
...       for n in range(4):
...         d[i,j] += a[k,n,i] * b[n,k,j]
>>> c == d
array([[ True,  True],
       [ True,  True],
       [ True,  True],
       [ True,  True],
       [ True,  True]])

利用+和的重载的扩展示例 * :

>>> a = np.array(range(1, 9))
>>> a.shape = (2, 2, 2)
>>> A = np.array(('a', 'b', 'c', 'd'), dtype=object)
>>> A.shape = (2, 2)
>>> a; A
array([[[1, 2],
        [3, 4]],
       [[5, 6],
        [7, 8]]])
array([['a', 'b'],
       ['c', 'd']], dtype=object)
>>> np.tensordot(a, A) # third argument default is 2 for double-contraction
array(['abbcccdddd', 'aaaaabbbbbbcccccccdddddddd'], dtype=object)
>>> np.tensordot(a, A, 1)
array([[['acc', 'bdd'],
        ['aaacccc', 'bbbdddd']],
       [['aaaaacccccc', 'bbbbbdddddd'],
        ['aaaaaaacccccccc', 'bbbbbbbdddddddd']]], dtype=object)
>>> np.tensordot(a, A, 0) # tensor product (result too long to incl.)
array([[[[['a', 'b'],
          ['c', 'd']],
          ...
>>> np.tensordot(a, A, (0, 1))
array([[['abbbbb', 'cddddd'],
        ['aabbbbbb', 'ccdddddd']],
       [['aaabbbbbbb', 'cccddddddd'],
        ['aaaabbbbbbbb', 'ccccdddddddd']]], dtype=object)
>>> np.tensordot(a, A, (2, 1))
array([[['abb', 'cdd'],
        ['aaabbbb', 'cccdddd']],
       [['aaaaabbbbbb', 'cccccdddddd'],
        ['aaaaaaabbbbbbbb', 'cccccccdddddddd']]], dtype=object)
>>> np.tensordot(a, A, ((0, 1), (0, 1)))
array(['abbbcccccddddddd', 'aabbbbccccccdddddddd'], dtype=object)
>>> np.tensordot(a, A, ((2, 1), (1, 0)))
array(['acccbbdddd', 'aaaaacccccccbbbbbbdddddddd'], dtype=object)