用Ctypes将Numpy数组传递给C在Linux和Windows中是不同的

2024-04-27 02:48:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将Numpy数组传递到C中,但在Windows和Linux中得到不同的结果。你知道吗

在Python中

import platform
import numpy as np
import ctypes

if platform.system() == 'Windows':
    c_fun = np.ctypeslib.load_library("/mypath/c_fun.dll", ".").c_fun
else:    # Linux
    c_fun = np.ctypeslib.load_library("/mypath/c_fun.so", ".").c_fun
c_fun.argtypes = [np.ctypeslib.ndpointer(dtype=np.int, ndim=2, flags="C_CONTIGUOUS"), ctypes.c_int, ctypes.c_int]

array = np.array([[0, 1, 0], [0, 1, 0], [0, 1, 0]])
rows, cols = array.shape
c_fun(array, rows, cols)

在C中

void c_fun(int* array, int rows, int cols)
{
    for (int i = 0; i < rows * cols; i++)
        printf("%d ", array[i]);
}

当我在Windows下运行这个程序时,输出是“0 1 0 0 1 0 0 1 0”,效果很好。你知道吗

但是在Linux中,输出是“0 0 1 0 0 0 0 0 1”,为什么?你知道吗


Tags: importlinuxwindowsnplibraryloadctypesarray
1条回答
网友
1楼 · 发布于 2024-04-27 02:48:14

首先,不要使用numpy.int。这只是int,不是什么傻事。我认为这是为了向后兼容。你知道吗

默认情况下,NumPy将Python int转换为数据类型numpy.int_(注意下划线),并且numpy.int_对应于Clong,而不是Cint。因此,只有当C intlong的大小相同时,您的代码才能工作,这两种大小在Windows上相同,但在Linux上不同。你知道吗

相关问题 更多 >