Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当numpy数组被C函数改变时,魔法就发生了_Python_C_Numpy_Ctypes - Fatal编程技术网

Python 当numpy数组被C函数改变时,魔法就发生了

Python 当numpy数组被C函数改变时,魔法就发生了,python,c,numpy,ctypes,Python,C,Numpy,Ctypes,我试图将numpy数组传递到C函数中,在这里我想更改数组的值。但我必须将索引乘以2才能使它正常工作。将一个值赋给一个奇数索引(让它成为i)会导致将一个垃圾赋给索引i-1/2。这是源代码 C: Python: import ctypes, numpy lib2 = ctypes.cdll.LoadLibrary('./assign_array.so') for i in range(5): array = numpy.zeros(8, dtype = int) ptr = arra

我试图将numpy数组传递到C函数中,在这里我想更改数组的值。但我必须将索引乘以2才能使它正常工作。将一个值赋给一个奇数索引(让它成为i)会导致将一个垃圾赋给索引i-1/2。这是源代码

C:

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)
为什么会发生这种情况?

这并不完全是垃圾:2047是0x7e1,8662949036032是0x7E100000000。看起来好像您混合了提供给C编译器的不同C编译器或标志,因此Python认为int是64位的,但您的C编译器认为int是32位的。尽管事实上,Python中的int不能保证与C编译器中的int匹配;它可能更典型地匹配long


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

我是这样编译的:gcc-shared-o assign\u array.so-fPIC assign\u array.ct这表明虽然不能证明您使用的是Linux/Unix ish系统,但您的基本Python可能使用C long作为其内部int类型,基本C编译器的长度为64位。其他C编译器也类似。@MatteoItalia:see updatewithinsertional:Python int很可能映射到C long。64位int确实很少见;Cray就是其中之一。哦,将dtype设置为numpy.int32解决了这个问题。非常感谢。
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)