Spec-Zone.ru › NumPy 2.0

numpy.linalg.tensordot

linalg.tensordot(x1, x2, /, *, 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 или (2,) array_like
  • целочисленное значение. Если это целое число N, суммирование производится по последним N осям a и первым N осям b в порядке. Размеры соответствующих осей должны совпадать.
  • (2,) array_like Или, список осей, по которым производится суммирование, первая последовательность относится к a, вторая — к b. Оба элемента array_like должны иметь одинаковую длину.
Возвращаемое значение:
outputndarray

Тензорное скалярное произведение входных данных.

См. также

dot, einsum

Примечания

Три общих случая использования:

  • axes = 0 : тензорное произведение \(a\otimes b\)
  • axes = 1 : тензорное скалярное произведение \(a\cdot b\)
  • axes = 2 : (по умолчанию) двойное тензорное сокращение \(a:b\)

Когда axes — положительное целое число N, операция начинается с оси -N a и оси 0 b, и продолжается до оси -1 a и оси N-1 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–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/generated/numpy.linalg.tensordot.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API