2012-12-01 14 views
12

Mam niestandardowy typ danych pływających, który emuluje pływające po 128 bitów przy użyciu dwóch platform 64-bitowych (podwójna podwójna klasa dd_real z QD library). Z C++ chcę wyeksportować ndarray do Pythona. Już wiem, jak to zrobić dla 64-bitowych platform, ale dla podwójnych-podwójnych muszę w jakiś sposób określić własny niestandardowy typ dtype. Jak to zrobić?Jak zdefiniować niestandardowe typy dumpów typu float (C-API)?

Uwaga: numpy ma własny 128-bitowy float (np.float128), niestety ten mapuje do long double w C/C++, który jest zaledwie 80-bitowym plikiem pływającym przechowywanym w 128-bitowym (na wszystkich moich platformach).

W rzeczywistości, powinno być możliwe zrobienie tego dokładnie w taki sam sposób, jak eksport numpy np.float128 (po prostu nie wiem jak to się robi), z tą tylko różnicą, że używa on dd_real po stronie C++ zamiast long double.

Jeśli to pomaga, już wyeksportowałem typ C++ dd_real do pythona za pomocą boost::python, może to może być w jakiś sposób ponownie wykorzystane.


Do tej pory udało mi się zbadać następujące

  1. numpy dokumentacja dtypes dotyczy C-API na temat eksportu niestandardowych dtypes, ale dokument ten jakoś tylko wyjaśnia istniejące dtypes nie jak tworzyć nowe.

  2. Kiedy stackoverflow znalazłem przykład this, ale zastanawiam się, czy dla dd_real może to być prostsze. Nie widzę również, gdzie faktycznie generowany jest typ dtype. Może tylko w pytonie __ init__ przez np.typeDict['quaternion'] = np.dtype(quaternion). Jak używać tego dtype w C++, gdy chcę wygenerować ndarray?

Odpowiedz

4

Repozytorium jesteś związana,

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

prawdopodobnie zawiera możliwie najprostszych przykładów, jak dodać nowy dtype do NumPy. Nie jestem świadomy łatwiejszego sposobu. Zwróć uwagę na połączenia do register_cast_function i w tych plikach: te informują Numpy, w jaki sposób operacje takie jak mnożenie i rzutowanie powinny być wykonywane na poziomie element po elemencie.

Jednakże, jeśli to, co rzeczywiście chcesz zrobić, to tylko wyeksportować swoje dane, można po prostu wyeksportować w postaci tablicy podwaja lub może łączenie dwa dwuosobowe do pojedynczego typu danych

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

Następnie należy Konieczne jest pisanie osobnych funkcji do wykonywania operacji na tych tablicach (ponieważ arr1 * arr2 nie zrobi tego, co chcesz tutaj). Jednym z możliwych sposobów, aby pójść dalej i sprawić, że będzie działał arr1 * arr2 będzie podklasa np.ndarray Twój typ danych, przesłaniając operacje __mul__ itd.

+0

co jest odpowiednikiem 'np.dtype (...)' w C++? –

+1

Skonstruuj listę za pomocą krotek i wywołaj 'PyArray_DescrConverter'. Ale prawdopodobnie łatwiej jest wyeksportować tablicę podwójnych i zrobić to po stronie Pythona. –

+2

Cóż, potrzebuję skonstruować ndarray z C++ i do tego potrzebuję dtype w C++. –