从ctypes数组获取数据到numpy

从ctypes数组获取数据到numpy,第1张

从ctypes数组获取数据到numpy

从ctypes指针对象创建NumPy数组是有问题的 *** 作。尚不清楚谁真正拥有指针指向的内存。什么时候可以再次释放?有效期有多长?只要有可能,我都会尽量避免这种构造。在Python代码中创建数组并将其传递给C函数比使用不认识Python的C函数分配的内存要容易得多,更安全。通过执行后者,您在某种程度上会否定使用高级语言进行内存管理的优势。

如果您确实确定有人会照顾内存,则可以创建一个暴露Python“缓冲区协议”的对象,然后使用此缓冲区对象创建一个NumPy数组。您通过未记录的

int_asbuffer()
函数给出了一种在帖子中创建缓冲区对象的方法:

buffer = numpy.core.multiarray.int_asbuffer(    ctypes.addressof(y.contents), 8*array_length)

(请注意,我替换

8
np.dtype(float).itemsize
。在任何平台上,它始终为8。)创建缓冲区对象的另一种方法是
PyBuffer_FromMemory()
通过ctypes从Python
C API调用该函数:

buffer_from_memory = ctypes.pythonapi.PyBuffer_FromMemorybuffer_from_memory.restype = ctypes.py_objectbuffer = buffer_from_memory(y, 8*array_length)

对于这两种方式,您都可以通过以下方式创建一个NumPy数组

buffer

a = numpy.frombuffer(buffer, float)

(我实际上不明白为什么要使用

.astype()
而不是第二个参数
frombuffer
;此外,我想知道为什么要使用
np.int
,而您之前说过数组包含
double
s。)

恐怕它不会比这容易得多,但这还不是很糟糕,您不觉得吗?您可以将所有难看的细节掩埋在包装函数中,而不必担心它。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5616544.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存