[英]How to create n-dim numpy array from a pointer?
我读过关于numpy.frombuffer的内容,但找不到任何从指针创建数组的方法。
正如上面的评论所指出的,你可以使用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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.