xtensor передает массив numpy в функцию с типом аргумента xt :: xtensor - PullRequest
1 голос
/ 17 мая 2019

Я играю с xtensor, так что я могу использовать его из Python.Тем не менее, одна из привлекательных сторон xtensor заключается в том, что также легко создавать привязки для R, поэтому напишите алгоритм один раз, затем напишите привязки для python и привязки для R, и все готово.

У меня естьначал с python, и я получил свой код для правильной работы, когда я установил тип аргумента xt :: pyarray.

void func(const xt::pyarray<float> x) { ... }
...
m.def("func", &func);

Однако я подозреваю, что xt :: pyarray не будет подходящим, еслиЯ пытаюсь сделать R привязки.Кроме того, xt :: pyarray, вероятно, является типом xt :: xarray.Я помню, как читал где-то, что xt :: xtensor может быть лучше оптимизирован, так как количество измерений известно заранее.Итак, xt :: xtensor - путь.

void func(const xt::xtensor<float, 2> x) { ... }
...
m.def("func", &func);

Так что я делаю это изменение, и это здорово - оно все еще работает.Но сейчас, я не знаю, как это назвать от NumPy.Если я называю это так, как раньше, используя np.ndarrays, это больше не работает и информирует меня о том, что типы не совпадают.Я также пытался преобразовать np.ndarrays с np.asmatrix(x, dtype=np.float32), но это также не работает.

Как мне вызвать эту функцию из numpy, чтобы заставить это работать?

1 Ответ

1 голос
/ 11 июня 2019

xtensor-python эквивалент xtensor равен pytensor точно так же, как pyarray - xtensor-pyrhon эквивалент xarray. Обратите внимание, что xtensor и pytensor - это разные типы, даже если они принимают одинаковые аргументы шаблона. pytensor может быть назначен пустой массив, в то время как xtensor не может (то же самое означает xarray и pyarray).

Также относительно возможности вызова вашего кода формы R, вы правы, pyarray и pytensor не являются подходящими типами. Один из способов решения этой проблемы - поместить вашу реализацию в обобщенную функцию, принимающую любые выражения, а затем создать интерфейс для каждого языка, принять соответствующие типы и перейти к реализации.

Более подробную информацию о написании привязок вашего кода C ++ к другим языкам можно найти в документации xtensor или в этом посте

...