Python C代码将传递的numpy数组中的其他索引视为零

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;

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;

        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