NumPy参考 >例行程序 >线性代数(numpy.linalg) > numpy.tensordot
numpy.
tensordot
(a,b,axes = 2 )[源代码] ¶沿指定轴计算张量点积。
给定两个张量,一个和b,和含有两个array_like对象的对象array_like, ,和的产品
一个的和b的元件(部件)在由指定的坐标轴
和。第三个参数可以是单个非负的integer_like标量;如果是这样,则最后的尺寸一与所述第一尺寸b相加结束。(a_axes, b_axes)
a_axes
b_axes
N
N
N
张量为“点”。
integer_like如果int N,求和的最后N轴一和的第一N轴b在顺序。相应轴的尺寸必须匹配。
(2,)array_like或要求和的轴列表,第一个序列应用于a,第二个序列应用于b。两个元素array_like必须具有相同的长度。
输入的张量点积。
笔记
axes = 0
:张量积
axes = 1
:张量点积
axes = 2
:(默认)张量双收缩
当轴为integer_like时,评估顺序为:首先是a中的-N轴和b中的第0轴,最后是b中a和N轴中的第-1轴。
如果有多个轴求和-并且它们不是a(b)的最后(第一个)轴-参数轴应由两个长度相同的序列组成,第一个轴求和于给定的第一个两个序列,第二个轴第二个,依此类推。
结果的形状包括第一个张量的非收缩轴,然后是第二个张量的非收缩轴。
例子
一个“传统”的例子:
>>> 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)