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

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

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

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

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


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

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

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

13

Решение

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

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

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

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

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

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

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector