dask.array.tensordot

dask.array.tensordot

dask.array.tensordot(lhs, rhs, axes=2)[源代码]

计算沿指定轴的张量点积。

此文档字符串是从 numpy.tensordot 复制的。

Dask 版本可能存在一些不一致性。

给定两个张量,ab,以及一个包含两个数组对象的类数组对象 (a_axes, b_axes),对 ab 的元素(分量)在 a_axesb_axes 指定的轴上求和。第三个参数可以是一个非负整数标量 N;如果是这样,那么 a 的最后 N 个维度和 b 的前 N 个维度将被求和。

参数
a, barray_like

张量到“点”。

int 或 (2,) 数组类
  • integer_like 如果是一个整数 N,则对 a 的最后 N 个轴和 b 的前 N 个轴进行求和。相应轴的大小必须匹配。

  • (2,) array_like 或者,要进行求和的轴列表,第一个序列应用于 a,第二个应用于 b。两个元素 array_like 必须具有相同的长度。

返回
输出ndarray

输入的张量点积。

参见

dot, einsum

注释

三种常见的使用情况是:

  • axes = 0 : 张量积 \(a\otimes b\)

  • axes = 1 : 张量点积 \(a\cdot b\)

  • axes = 2 : (默认) 张量双收缩 \(a:b\)

axes 是一个正整数 N 时,操作从 a 的轴 -Nb 的轴 0 开始,并继续到 a 的轴 -1b 的轴 N-1 (包括)。

当有多个轴需要求和时 - 并且它们不是 a (b) 的最后一个(第一个)轴 - axes 参数应包含两个长度相同的序列,第一个求和的轴在两个序列中首先给出,第二个轴其次,依此类推。

结果的形状由第一个张量的非收缩轴,接着是第二个张量的非收缩轴组成。

示例

一个“传统”的例子:

>>> import numpy as np  
>>> 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)