numpy.tensordot

原文:https://docs.scipy.org/doc/numpy/reference/generated/numpy.tensordot.html

译者:飞龙 UsyiyiCN

校对:(虚位以待)

numpy.tensordot(a, b, axes=2)[source]

对于数组> = 1-D,沿指定轴计算张量点积。

给定两个张量(维度大于或等于一的数组),ab,以及包含两个array_like对象的array_like对象(a_axes , t> b_axes),将ab的元素由a_axesb_axes指定的轴。第三个参数可以是单个非负整数_样标量,N;如果是这样,则将a的最后N维度和b的第一N

参数:

a,b:array_like,len(shape)> = 1

拉伸到“点”。

axes:int或(2,)array_like

  • integer_like如果一个int N,在a的最后N个轴和b的前N个轴按顺序求和。相应轴的大小必须匹配。
  • (2,)array_like或者,要求和的轴列表,第一个序列应用于a,第二个应用于b两个元素array_like必须具有相同的长度。

也可以看看

doteinsum

笔记

三种常见的用例是:
axes = 0 : tensor product $aotimes b$ axes = 1 : tensor dot product $acdot b$ axes = 2 : (default) tensor double contraction $a:b$

是整数类型时,用于评估的序列将是:首先在a中的第-N个轴和在b中的第0个轴,轴在a和Nth轴在b最后。

当有多个轴相加时 - 并且它们不是ab)的最后(第一个)轴 - 参数轴 t2 >应该由具有相同长度的两个序列组成,其中第一轴在两个序列中首先给定,第二轴在第二,等等。

例子

一个“传统”的例子:

>>> 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]], dtype=bool)

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

>>> 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)