У меня есть пользовательский тип данных с плавающей точкой, который эмулирует 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
может быть, это можно использовать как-нибудь.
До сих пор я смог исследовать следующее
Numpy документация для dtypes относится к C-API, о том, как экспортировать пользовательские dtypes, но этот документ как-то объясняет только существующие dtypes, а не как создавать новые.
когда просмотр StackOverflow я нашел этот пример, но мне интересно, если для dd_real
это может быть проще. Я также не вижу, где на самом деле генерируется dtype. Возможно только в питоне __ в этом__ с помощью np.typeDict['quaternion'] = np.dtype(quaternion)
, Как использовать этот dtype в C ++, когда я хочу создать ndarray?
Репозиторий, с которым вы связаны,
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__
и т.д. операции.
Других решений пока нет …