Numpy Einsum вещание

Может кто-нибудь объяснить, как вещание (многоточие) работает в функции numpy.einsum()?

Будем весьма благодарны за некоторые примеры, показывающие, как и когда это можно использовать.

Я проверил следующую официальную страницу документации, но есть только 2 примера, и я не могу понять, как ее интерпретировать и использовать.

http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.einsum.html

1 ответ

Решение

Эллипсы - это условное обозначение, обозначающее "все остальные оси, не упомянутые явно". Например, предположим, что у вас есть массив формы (2,3,4,5,6,6):

import numpy as np
arr = np.random.random((2,3,4,5,6,6))

и вы хотите проследить его последние две оси:

result = np.einsum('ijklmm->ijklm', arr)
result.shape
# (2, 3, 4, 5, 6)

Эквивалентный способ сделать это будет

result2 = np.einsum('...mm->...m', arr)
assert np.allclose(result, result2)

Эллипсы обеспечивают сокращенное обозначение (в данном случае) "и все оси влево". ... стоять за ijkl,

Одна хорошая вещь о том, чтобы не быть явным, это то, что

np.einsum('...mm->...m', arr)

одинаково хорошо работает с массивами любого числа измерений>= 2 (при условии, что последние два имеют одинаковую длину), тогда как

np.einsum('ijklmm->ijklm', arr)

работает только когда arr имеет ровно 6 размеров.


Когда эллипсы появляются в середине, это сокращение от "все средние оси, не упомянутые явно". Например, ниже, np.einsum('ijklmi->ijklm', arr)эквивалентно np.einsum('i...i->i...', arr), Здесь ... стоять за jklm:

arr = np.random.random((6,2,3,4,5,6))
result = np.einsum('ijklmi->ijklm', arr)
result2 = np.einsum('i...i->i...', arr)
assert np.allclose(result, result2)
Другие вопросы по тегам