numpy.tensordot
-
numpy.tensordot(a, b, axes=2)[source] -
Вычислить тензорное скалярное произведение по указанным осям для массивов >= 1-мерного.
Даны два тензора (массивы размерности не менее одного),
aиb, и массив, содержащий два массива,(a_axes, b_axes), суммировать произведения элементовaиb(компоненты) по осям, указанным вa_axesиb_axes. Третий аргумент может быть единственным неотрицательным целым скалярным значением,N; если это так, то последниеNизмеренияaи первыеNизмеренияbсуммируются.Параметры: a, b : array_like, len(shape) >= 1
Тензоры для “скалярного произведения”.
axes : int или (2,) array_like
- целочисленное значение Если целое число N, суммировать по последним N осям
aи первым N осямbв порядке. Размеры соответствующих осей должны совпадать. - (2,) array_like Или, список осей для суммирования, первая последовательность применяется к
a, вторая кb. Оба элемента array_like должны иметь одинаковую длину.
Примечания
- Три распространенных случая использования:
-
-
axes = 0: тензорное произведение -
axes = 1: тензорное скалярное произведение -
axes = 2: (по умолчанию) тензорное двойное сокращение
-
Когда
axes— целое число, последовательность вычислений будет следующей: сначала -Nth ось вaи 0-я ось вb, затем -1-я ось в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)
- целочисленное значение Если целое число N, суммировать по последним N осям
© 2005–2019 NumPy Developers
Licensed under the 3-clause BSD License.
https://docs.scipy.org/doc/numpy-1.14.5/reference/generated/numpy.tensordot.html