当numpy数组通过C函数改变时,魔术正在发生

时间:2017-03-26 00:10:28

标签: python c numpy ctypes

我正在尝试将numpy数组传递给我想要更改数组值的C函数。但我必须将索引乘以2才能使其正常工作。将值分配给奇数索引(让它为i)会导致为索引(i-1)/2分配垃圾。这是源代码。

C:

#include "assign_array.h"

void assign(int *arr, int i) {
    arr[i] = 2017;
}

的Python:

import ctypes, numpy
lib2 = ctypes.cdll.LoadLibrary('./assign_array.so')
for i in range(5):
    array = numpy.zeros(8, dtype = int)
    ptr = array.ctypes.data_as(ctypes.POINTER(ctypes.c_int))
    print('i = {}:'.format(i))
    lib2.assign(ptr, i)
    print(array)

Screenshot

为什么会这样?

1 个答案:

答案 0 :(得分:1)

垃圾:20470x7e186629490360320x7E100000000。看起来好像是在混合使用不同的C编译器(或者提供给C编译器的标志),因此Python认为int是64位,但是你的C编译器认为int是32位。实际上,虽然Python中的int不能保证在C编译器中匹配int;它通常更匹配long

根据the numpy documentationdtype可以指定为numpy.int32,专门指代32位int。这可能是处理此问题的最简单方法,当然您可以更改C代码以使用long(假设C编译器的设置中为64位long)。