gpt4 book ai didi

python - 带有 numpy ctypes 的大数组

转载 作者:太空宇宙 更新时间:2023-11-04 04:45:06 25 4
gpt4 key购买 nike

我有一个接收 int 数组的 C++ 函数,我正在用 ctypesnumpy 为它制作一个 python 包装器。这是一个最小的例子:

复制.cpp

#include <vector>

extern "C" std::vector<int>* copy_vec(int* array, int size){
std::vector<int>* vec = new std::vector<int>(size);
for (int i=0; i<size; i++){
vec->push_back(array[i]);
}
return vec;
}

复制.py

import ctypes as ct
import numpy as np

INT_POINTER = ct.POINTER(ct.c_int)

_lib = ct.cdll.LoadLibrary('./libcopy.dll')
_lib.copy_vec.argtypes = [INT_POINTER, ct.c_int]

def copy(nums):
size = len(nums)
nums_c = np.array(nums).ctypes.data_as(INT_POINTER)
vector = _lib.copy_vec(nums_c, size)
return vector

array =[12]*1000000
copy(array)

这会产生以下错误消息:

---------------------------------------------------------------------------
WindowsError Traceback (most recent call last)
<ipython-input-2-752101759a61> in <module>()
1 array =[12]*1000000
----> 2 copy(array)

<ipython-input-1-f18316d64ae3> in copy(nums)
10 size = len(nums)
11 nums_c = np.array(nums).ctypes.data_as(INT_POINTER)
---> 12 vector = _lib.copy_vec(nums_c, size)
13
14 return vector

WindowsError: exception: access violation reading 0x08724020

此代码适用于像 array =[12]*100 这样的小数组,但在使用大数组时会失败。

最佳答案

找了半天才发现问题

我使用 np.array(nums) 创建了一个数组,然后使用 .ctypes.data_as(INT_POINTER) 创建了一个指向该数组的 ctypes 指针。由于没有保留 numpy 数组的引用,因此指针将指向一个临时变量。解决这个问题的方法是在 python 中保留对数组的引用。

nums_a = np.array(nums)
nums_c = nums_a.ctypes.data_as(INT_POINTER)

完整的函数是:

def copy(nums):
size = len(nums)
nums_a = np.array(nums)
nums_c = nums_a.ctypes.data_as(INT_POINTER)
vector = _lib.copy_vec(nums_c, size)

return vector

对于小型阵列,可能有足够的时间在回收其内存之前完成复制阵列,但对于大型阵列,这种内存回收可能具有更高的优先级。

更多内容可以在 numpy.ndarray.ctypes 阅读

关于python - 带有 numpy ctypes 的大数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49803464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com