Как обрабатывать буферный объект из pybind11 как NumPy ndarray с минимальным синтаксисом? - PullRequest
0 голосов
/ 27 марта 2020

Примечание. Перед повторением вопроса после блока кода предоставляется дополнительная информация и подробности.

Большая картинка

Я создаю библиотеку для использования на C ++ и Python , Реализация на C ++, с тонкой оболочкой для пользователей, чтобы иметь возможность создавать проекты в Python с использованием этой библиотеки с минимальным влиянием на производительность. Возможность использовать API на обоих языках является жестким требованием.

В конечном счете, я хочу упростить задачу (с точки зрения того, сколько пользователей нужно набирать на клавиатуре, чтобы делать что-то, что будет часто появляться) для пользователей этой библиотеки. Этот вопрос касается Python API.

Теперь немного глубже ...

Я работаю над проектом, в котором у меня есть класс, написанный на C ++, и я его раскрываю до Python. Я использую Pybind11, чтобы сделать это. Я хочу относиться к своему классу как к NumPy ndarray без создания копии.

Это позволит пользователям API Python работать полностью в Python, что является жестким требованием этого проекта. Использование numpy без создания копий базовых данных также является жестким требованием.

Иллюстративный пример

Допустим, я определил класс Foo в C ++ и следовал инструкциям на pybind11, чтобы учесть следующее (на самом деле, я сделал это, за исключением части, где написано «Я хочу это ...»):

from mymodule import Foo
import NumPy as np

# assume arg1 and arg2 are defined
f = Foo(arg1)
g =Foo(arg2)
h = Foo() # Foo has multiple constructors

# I want this...
h[:] = f + g

# ...to be equivalent to this (this is the part I’ve done successfully):
H = np.array(h, copy=False)
H[:] = np.array(f, copy=False) + np.array(g, copy=False)

Вопрос

Есть ли способ сделать то, что я описал в блоке кода выше?

Это не проблема XY

Цель состоит в том, чтобы заставить пользователя печатать меньше, учитывая требование доступности данных через numpy .ndarray объекты без копирования базовых данных. В идеале это означает, что вы должны обращаться с объектами так, как будто они уже являются numpy .ndarray объектами без каких-либо дополнительных вызовов функций или операций.

До сих пор не исследовано ...

Я знаю, что это много спрашиваю Python, потому что я работаю с типом, отличным от того, что f и g - они даже не наследуются от numpy .ndarray.

Я пытался заглянуть в декораторы классов , Интересно, можно ли импортировать Foo, а затем украсить его так, чтобы f=Foo() эквивалентно f=np.array(Foo(), copy=False), где Foo реализован на C ++. Я не уверен, как работают декораторы, несмотря на RTFM, если это правильный путь, или я близок к тому, чтобы доказать, что это невозможно.

...