Python C代码将传递的numpy数组中的其他索引视为零
Debian版本:WSL上的Buster(10) numpy版本:1.20.1 python版本:3.7.3 gcc版本:8.3.0 我试图将一个numpy数组传递给一个用C编写的函数。C函数将数组的长度视为两倍,而其他条目的长度为零。我不知道为什么会发生这种情况,也找不到任何人遇到类似问题的实例 下面是Python C代码将传递的numpy数组中的其他索引视为零,python,c,numpy,ctypes,Python,C,Numpy,Ctypes,Debian版本:WSL上的Buster(10) numpy版本:1.20.1 python版本:3.7.3 gcc版本:8.3.0 我试图将一个numpy数组传递给一个用C编写的函数。C函数将数组的长度视为两倍,而其他条目的长度为零。我不知道为什么会发生这种情况,也找不到任何人遇到类似问题的实例 下面是function.c的内容: #include <stdio.h> void function(int* array, int size) { int i;
function.c
的内容:
#include <stdio.h>
void function(int* array, int size) {
int i;
for (i = 0; i < size; ++i) {
printf("i = %d, array value = %d \n", i, array[i]);
}
}
int main() {
return 0;
}
这里是python文件,main.py
,它用一个简单数组调用C代码
import numpy as np
import ctypes
c_int_array = np.ctypeslib.ndpointer(dtype=np.int64, ndim=1, flags='C_CONTIGUOUS')
lib = np.ctypeslib.load_library('function.so', '.')
lib.function.argtypes = [c_int_array, ctypes.c_int]
array = np.array([1,2,3,4])
lib.function(array, len(array))
当我运行main.py
文件时,我得到以下结果
i = 0, array value = 1
i = 1, array value = 0
i = 2, array value = 2
i = 3, array value = 0
下面是当我将数组的大小乘以2时发生的情况<代码>库函数(数组,2*len(数组))
在将numpy数组从python传递到C代码时,似乎出现了一个问题。任何其他指数为零都是非常奇怪的
知道是什么原因造成的吗?以及如何修复?像往常一样,我可能在做一些明显而愚蠢的事情,但我似乎无法理解这一点。我试图使这个问题的代码尽可能简单合理。正如我在评论中最初假设的那样,问题是由以下几行文字引起的:
#Python
c_int_array=np.ctypeslib.ndpointer(dtype=np.int64,ndim=1,flags='c_continuous')
/C
void函数(int*数组,int大小)
这里,Python指针是指向64位整数的指针,但C函数接受指向32位整数的指针,其长度正好是64位整数的两倍
有两种方法可以解决此问题:
- 从Python传递指向
的指针np.int32
- 在C中接受指向
或long
的指针:int64\t
#包括 void函数(int64_t*数组,int size)
dtype=np.int64
中,类型是64位宽的,但您的函数接受int*数组
——指向32位整数的指针。是的,就是这样。我将numpy数组更改为dtype=np.int32
,问题就消失了。非常感谢。
i = 0, array value = 1
i = 1, array value = 0
i = 2, array value = 2
i = 3, array value = 0
i = 0, array value = 1
i = 1, array value = 0
i = 2, array value = 2
i = 3, array value = 0
i = 4, array value = 3
i = 5, array value = 0
i = 6, array value = 4
i = 7, array value = 0