numpy.
tensordot
沿指定轴计算张量点积。
给定两个张量, a 和 b 以及包含两个数组类对象的数组类对象, (a_axes, b_axes) ,求和 a S和 b 的元素(组件)位于由指定的轴上 a_axes 和 b_axes . 第三个参数可以是单个非负整数类标量, N ;如果是这样,那么最后一个 N 尺寸 a 第一 N 尺寸 b 总结。
(a_axes, b_axes)
a_axes
b_axes
N
张量到“点”。
整数,如int n,和 a 和的前n个轴 b 整齐。相应轴的大小必须匹配。
(2,)数组或,要求和的轴列表,应用于 a 第二 b . 两个元素数组的长度必须相同。
输入的张量积。
参见
dot
einsum
笔记
axes = 0 : tensor product
axes = 0
axes = 1 : tensor dot product
axes = 1
axes = 2 : (default) tensor double contraction
axes = 2
什么时候? 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)