2014-12-28 20 views
9

Cách kinh điển để nhận ma trận cứng nhắc như một đối số cho hàm C có con trỏ kép là gì?Cách thích hợp để đúc numpy.matrix thành con trỏ kép

Context: Tôi đang sử dụng numpy để xác nhận một số mã C-to wit, tôi có một hàm C mà phải mất một const double ** const, và tôi đang sử dụng ctypes gọi .so từ Python.

Tôi đã thử:

func.argtypes = ctypeslib.ndpointer(dtype=double, ndim=2, flags="C_CONTIGUOUS") 

và thông qua ma trận numpy trực tiếp (không làm việc), cũng như

func.argtypes = ctypes.POINTER(ctypes.POINTER(ctypes.c_double)) 

và sau đó thông qua ma trận numpy qua dàn diễn viên khác nhau. Đúc dẫn đến lỗi Python

TypeError: _type_ must have storage info 

Note: Câu hỏi này đã đưa ra một vài năm trước đây here, nhưng không có độ phân giải hoàn toàn thành công.

+8

mảng cố định lý tưởng là một phần bộ nhớ liền kề, được lập chỉ mục như 'A [i, j] = A [i * n_columns + j]', không phải mảng 1D chứa con trỏ tới mảng tăng gấp đôi, vì vậy không có giải pháp dễ dàng. Bạn cần phải xây dựng mảng 1D của con trỏ tới mỗi hàng theo cách thủ công. –

+2

@ RobertT.McGibbon: Bạn muốn chuyển câu trả lời này để chúng tôi có thể đóng câu hỏi? – user14717

+2

Ngoài ra còn có một cuộc thảo luận rất đầy đủ về chủ đề này trên danh sách gửi thư gắt gỏng: http://mail.scipy.org/pipermail/numpy-discussion/2015-January/071957.html –

Trả lời

1

Tôi nghĩ bạn đang tìm kiếm giao diện ctypes trong số ndarray s của numpy (hoặc matrix cho vấn đề đó). Bạn có thể có một số look here for more information on numpy's manual.

Xin lưu ý rằng các cửa hàng C-API gọn gàng ndarray s (hoặc ma trận cho vấn đề đó) với một con trỏ (xem http://docs.scipy.org/doc/numpy/reference/c-api.types-and-structures.html#c.PyArrayObject). Bạn không thể chuyển đổi con trỏ đơn này thành một con trỏ kép trong C, chỉ vì đây là các loại khác nhau. Hơn nữa, không chỉ lưu trữ dữ liệu trên các đối tượng này, nó còn lưu trữ thông tin về hình dạng của ma trận và các bước tiến (cách dữ liệu được tổ chức trên con trỏ dữ liệu được cung cấp). Nếu không biết tất cả các thông tin này, mã của bạn sẽ không hoạt động trên tất cả các điều kiện. Ví dụ: nếu bạn chuyển đổi ma trận trước khi liên kết nó với mã của bạn, bạn sẽ nhận được kết quả không mong muốn!

Có một vài giải pháp tùy thuộc vào thiết lập của bạn:

  1. Nếu bạn có thể sửa đổi API của thư viện của bạn, thay đổi nó để bạn có thể chuyển thông tin NumPy liên quan đến không chỉ con trỏ dữ liệu, mà còn là hình dạng của ma trận và các bước tiến của nó. Sau đó, sử dụng liên kết ở trên để tìm hiểu cách giao diện hỗ trợ numpy/ctypes với API mới của bạn.

  2. Nếu bạn không thể sửa đổi API của mình, tôi khuyên bạn nên tạo hàm Python dựa trên ctypes chuyển đổi nội dung của mảng cố định thành ma trận hai con trỏ được tạo với chính ctypes (as suggested on this discussion). Ngoài ra, hãy thêm hỗ trợ cho hình dạng đối tượng bị sần và sải chân để bạn có thể chạy chuyển đổi đúng cách. Sau khi chuyển đổi, chuyển cấu trúc con trỏ kép vừa tạo ra cho hàm ban đầu của bạn.

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