Передача массива Numpy в C с Ctypes различается в Linux и Windows - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь передать массив 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 01 ", почему?

1 Ответ

2 голосов
/ 08 ноября 2019

Во-первых, не используйте numpy.int. Это просто int, а не NumPy. Я думаю, что это для обратной совместимости.

NumPy по умолчанию преобразует Python ints в dtype numpy.int_ (обратите внимание на подчеркивание), а numpy.int_ соответствует C long, а не Cint. Таким образом, ваш код работает только тогда, когда C int и long имеют одинаковый размер, который они имеют в Windows, но не в Linux.

...