#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