如何从指针创建n-dim numpy数组?

时间:2014-05-29 10:00:47

标签: python arrays ctypes

我读过关于numpy.frombuffer的内容,但无法找到从指针创建数组的任何方法。

1 个答案:

答案 0 :(得分:13)

正如上面的评论所指出,您可以使用numpy.ctypeslib.as_array

  

numpy.ctypeslib.as_array(obj,shape = None)

     

从ctypes数组或ctypes POINTER创建一个numpy数组。 numpy数组与ctypes对象共享内存。

     

如果从ctypes POINTER转换,则必须提供size参数。   如果从ctypes数组转换

,则忽略size参数

因此,让我们模仿一个C函数,返回一个调用malloc的指针:

import ctypes as C
from ctypes.util import find_library
import numpy as np

SIZE = 10

libc = C.CDLL(find_library('c'))
libc.malloc.restype = C.c_void_p

# get a pointer to a block of data from malloc
data_pointer = libc.malloc(SIZE * C.sizeof(C.c_int))
data_pointer = C.cast(data_pointer,C.POINTER(C.c_int))

现在,您可以使此指针指向的数据可用于numpy

new_array = np.ctypeslib.as_array(data_pointer,shape=(SIZE,))

并证明他们正在访问相同的内存:

new_array[:] = range(SIZE)

print "Numpy array:",new_array[:SIZE]
print "Data pointer: ",data_pointer[:SIZE]

应输出:

Numpy array: [0 1 2 3 4 5 6 7 8 9]
Data pointer:  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

最后请注意,numpy数组不拥有其内存,因此需要显式调用free来避免内存泄漏。

del new_array
libc.free(data_pointer)