numpy.tensordot¶
-
numpy.
tensordot
(a, b, axes=2)[source]¶ 对于数组> = 1-D,沿指定轴计算张量点积。
给定两个张量(维度大于或等于一的数组),a和b,以及包含两个array_like对象的array_like对象
(a_axes , t> b_axes)
,将a和b的元素由a_axes
和b_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必须具有相同的长度。
笔记
- 三种常见的用例是:
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最后。
当有多个轴相加时 - 并且它们不是a(b)的最后(第一个)轴 - 参数轴 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)