Эквивалент NumPy einsum для XTensor (C )

#python #c #numpy #xtensor

#python #c #numpy #xtensor ( экстенсор )

Вопрос:

В начале, это мой самый первый вопрос здесь, я действительно постараюсь изо всех сил описать,
пожалуйста, обратите внимание, если я сделал это неправильно.

Недавно я переписывал некоторые вещи numpy на C .
К сожалению, для этого потребовались обстоятельства. Я действительно ничего не могу с этим поделать.
(Я могу вызвать некоторые команды python из C , но не все.)

Естественно, я начал с XTensor, поскольку он утверждает, что является эквивалентом numpy на C .
К сожалению, я застрял на numpy.einsum
Я искал в Интернете и нашел некоторые связанные вещи, как это работает (по крайней мере, немного).

Тогда возникает моя проблема. Прежде всего, мне нужно реализовать версию без -> .
Документы Numpy говорят мне, что это что-то вроде «неявного режима» (тогда также с многоточием).
(Описано позже) Я нашел реализации / эквиваленты для некоторых конфигураций einsum,
таких как 'i,ij' и else .
Я хотел бы придерживаться XTensor, поскольку я уже сделал довольно много вещей.
Вот часть кода, которую мне нужно повторно реализовать в XTensor с помощью C :

 # a is ndarray with shape (1, 28), 2dim
# e is ndarray with shape (1, 28, 3, 17), 4dim

numpy.einsum('...i,...ijk', a, e)
 

Я надеюсь, что кто-нибудь может объяснить мне, к чему это относится.
И было бы лучше, если бы вы могли дать мне некоторое представление о том, как я мог бы это реализовать.
Я могу использовать что угодно, я думаю… что на самом деле закончится как xt::xarray в конце.
Я думал о вызове кода python из C или даже с помощью Google protobuf, в худшем случае.

Если у вас есть какие-либо идеи или полезные ссылки, пожалуйста, поделитесь ими!
(относится к опубликованному мной коду, а не к numpy.einsum общему)

Комментарии:

1. В этом примере i это 28 общих измерений, jk следующие размеры e . Это ... означает, что он может работать с любыми ведущими измерениями (здесь только 1), если они совпадают. Поскольку i является общим, это sum измерение для sum-of-products . Результатом будет (1,3,17), ‘…jk’.

2. @hpaulj Спасибо, это помогло мне немного понять, как это работает. В любом случае, я был бы очень благодарен, если бы вы могли сказать мне, с чем это связано a . Я имею в виду, из чего создается скалярное произведение, если оно перебирает размерность i ? Я все еще новичок в numpy, любая помощь будет оценена по достоинству. (документы numpy просто «быстро работают» над ним)

3. Это то, что я имею в виду sum-of-products . Обычным np.dot является ‘ij, jk-> ik’, где j суммируется общее измерение. einsum обобщает понятие, позволяя нам работать с большим количеством измерений.

4. К сожалению, einsum по-прежнему отсутствует для xtensor… Это высоко в моем списке пожеланий, но для реализации нужно время. В любом случае, возможен обходной путь для конкретной тензорной операции, я делаю это, используя тот факт, что ваши «тензоры» хранятся последовательно. Мои рабочие функции доступны здесь: github.com/tdegeus/GMatTensor