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