2012-06-29 39 views
12

tôi xây dựng một mảng NumPy ::làm thế nào để có được địa chỉ bộ nhớ của một mảng NumPy cho C

a=np.ndarray([2,3]) 

sau đó tôi muốn nhìn thấy nơi mà dữ liệu của nó là ::

a.data 
>>>Out[213]: <read-write buffer for 0x0482C1D0, size 48, offset 0 at 0x049E87A0> 
a.data 
>>>Out[214]: <read-write buffer for 0x0482C1D0, size 48, offset 0 at 0x049E82A0> 
a.data 
>>>Out[215]: <read-write buffer for 0x0482C1D0, size 48, offset 0 at 0x049E81C0> 

...

tại sao mỗi lần địa chỉ offset lại khác nhau? nếu tôi muốn chuyển dữ liệu đến một chức năng c sử dụng c_types bởi ::

ctypes_array = (ctypes.c_char * a.size * 8).from_address(ptr) 

làm thế nào tôi sẽ nhận được giá trị của ptr?

+0

http://stackoverflow.com/a/3671889/ liên quan – jfs

Trả lời

15

Ngoài ra, hãy xem ndarray.__array_interface__, là một dict chứa tất cả thông tin bạn đang theo dõi.

Trong trường hợp của bạn,

pointer, read_only_flag = a.__array_interface__['data'] 
+0

cảm ơn, đây là những gì tôi muốn :) – shelper

+0

Vui mừng nó giúp! Nó có thể không phải là cách tốt nhất hoặc hiệu quả nhất để làm điều đó, mặc dù. Như J.F.Sebastian đã đề cập, có một cái nhìn tại 'numpy.ctypeslib' (Mặc dù nếu tôi nhớ chính xác, nó cũng sử dụng' __array_interface__'). –

+1

@Joe Kết quả của 'a .__ array_interface __ ['data']' không bằng địa chỉ trong echo của 'a.data', như sau' >>> a = array ([(1,2)]) >>> a.data >>> print hex (một .__ array_interface __ [ 'dữ liệu'] [0]) 0x893ff38' – Samuel

3

a.data có thể là thuộc tính có chức năng getter tạo đối tượng đệm mới (siêu dữ liệu) trên mỗi cuộc gọi.

Để xem địa chỉ, hãy xem cách numpy.ctypeslib.as_ctypes() được triển khai.

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