2012-12-01 33 views
12

Tôi có kiểu dữ liệu float tùy chỉnh mô phỏng nổi 128bit sử dụng hai float nổi 64bit (double double double class dd_real từ QD library). Từ C + +, tôi muốn export một ndarray vào python. Tôi đã biết làm thế nào để làm điều này cho nổi 64bit, nhưng đối với đôi tăng gấp đôi tôi bằng cách nào đó cần phải xác định dtype tùy chỉnh của riêng tôi. Làm thế nào để làm điều đó?Làm thế nào để xác định kiểu tùy chỉnh kiểu float (C-API)

Lưu ý: numpy có phao 128bit (np.float128) của nó không may này ánh xạ tới long double trong C/C++ mà chỉ đơn thuần là một 80bit-float được lưu trữ trong 128bit (trên tất cả các nền tảng của tôi).

Thực tế, người ta có thể làm điều này một cách chính xác giống như cách xuất khẩu np.float128 (Tôi không biết cách thực hiện), với sự khác biệt duy nhất là sử dụng dd_real ở phía C++ thay vì long double.

Nếu điều này giúp, tôi đã xuất loại C++ dd_real thành python sử dụng boost::python có thể điều này có thể được sử dụng lại bằng cách nào đó.


Cho đến nay tôi đã có thể nghiên cứu sau

  1. Các tài liệu NumPy cho dtypes đề cập đến C-API cho cách xuất dtypes tùy chỉnh, nhưng tài liệu nào đó mà chỉ giải thích dtypes hiện không làm thế nào để tạo những cái mới.

  2. Khi browsing stackoverflow Tôi tìm thấy this ví dụ, nhưng tôi tự hỏi nếu cho dd_real điều này có thể đơn giản hơn. Tôi cũng không thấy nơi dtype thực sự được tạo ra. Có thể chỉ trong python __ init__ qua np.typeDict['quaternion'] = np.dtype(quaternion). Làm thế nào để sử dụng dtype trong C + + khi tôi muốn tạo ra một ndarray?

Trả lời

4

Các kho bạn liên kết đến,

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

lẽ chứa các ví dụ đơn giản nhất về cách thêm dtype mới để NumPy. Tôi không biết một cách dễ dàng hơn. Lưu ý các cuộc gọi đến register_cast_functionREGISTER_UFUNC trong các tệp này: chúng cho biết Numpy cách hoạt động như phép nhân và truyền nên được xử lý trên cấp phần tử theo phần tử.

Tuy nhiên, nếu những gì bạn thực sự muốn làm là để chỉ xuất dữ liệu của bạn, bạn có thể chỉ xuất khẩu như là một mảng của đôi, hoặc có thể bundling hai đôi để một kiểu dữ liệu đơn

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

Sau đó, bạn cần phải viết các hàm riêng biệt để thực hiện các thao tác trên các mảng này (như arr1 * arr2 sẽ không làm những gì bạn muốn ở đây). Một cách có thể để đi xa hơn và thực hiện thêm arr1 * arr2 để hoạt động sẽ là phân lớp np.ndarray loại dữ liệu của bạn, ghi đè hoạt động __mul__ v.v.

+0

tương đương với 'np.dtype (...)' trong C++ là gì? –

+1

Xây dựng danh sách với các bộ dữ liệu và gọi 'PyArray_DescrConverter'. Nhưng có lẽ dễ dàng hơn khi xuất một mảng đôi và làm điều đó ở phía Python. –

+2

Vâng tôi cần phải xây dựng một ndarray từ C + + và cho rằng tôi cần dtype trong C + +. –

Các vấn đề liên quan