Spec-Zone.ru › NumPy 1.14

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 должны иметь одинаковую длину.

См. также

dot, einsum

Примечания

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

Когда 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)

© 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

Spec-Zone.ru

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