Подтвердить что ты не робот

Как определить тип типа numpy типа float (C-API)

У меня есть пользовательский тип данных float, который эмулирует 128-битные поплавки с использованием двух 64-битных поплавков (двойной двойной класс dd_real из QD library). Из С++ я хочу экспортировать ndarray в python. Я уже знаю, как это сделать для 64-битных поплавков, но для double-doubles мне как-то нужно указать свой собственный dtype. Как это сделать?

Примечание: numpy имеет свой собственный 128-битный float (np.float128), к сожалению, это сопоставляется с long double в C/С++, который является просто 80-битным поплавком, хранящимся на 128 бит (на всех моих платформах).

Фактически, нужно иметь возможность сделать это точно так же, как numpy export np.float128 (я просто не знаю, как это делается), с той лишь разницей, что он использует dd_real на С++ вместо long double.

Если это помогает, я уже экспортировал С++-тип dd_real в python с помощью boost::python, возможно, это может быть каким-то образом использовано.


До сих пор я мог исследовать следующие

  • Документация numpy для dtypes относится к C-API для того, чтобы экспортировать пользовательские типы dtypes, но этот документ каким-то образом объясняет существующие типы dtypes не как создавать новые.

  • Когда просматривал stackoverflow, я нашел этот пример, но я интересно, если для dd_real это может быть проще. Я также не вижу, где dtype фактически генерируется. Возможно, только в python __ init__ через np.typeDict['quaternion'] = np.dtype(quaternion). Как использовать этот dtype в С++, когда я хочу сгенерировать ndarray?

4b9b3361

Ответ 1

Репозиторий, с которым вы связались,

https://github.com/numpy/numpy-dtypes

вероятно, содержит самые простые примеры того, как добавить новый dtype в Numpy. Я не знаю более простого способа. Обратите внимание на вызовы register_cast_function и REGISTER_UFUNC в этих файлах: они описывают Numpy, как операции, такие как умножение и литье, должны обрабатываться на уровне элемента за элементом.

Однако, если вы действительно хотите сделать это только для экспорта своих данных, вы можете просто экспортировать в виде массива удвоений или, возможно, объединить два двухлокальных номера в один тип данных

np.dtype([('a', double), ('b', double)])

Затем вам нужно будет написать отдельные функции для выполнения операций над этими массивами (поскольку arr1 * arr2 не будет делать то, что вы хотите здесь). Один из возможных способов пойти дальше и сделать также arr1 * arr2 для работы будет подкласс np.ndarray вашего типа данных, переопределяя операции __mul__ etc.