Как передать Fortran упорядоченный 2d NumPy массив в C++, используя SWIG

У меня есть функция в с ++

myfun(double* array, int n1, int n2);

что я взаимодействую с NumPy в Python. В моем файле интерфейса у меня есть

%apply (double* INPLACE_FARRAY2, int DIM1, int DIM2) {(double* inarray, int n1, int n2)}

Теперь я хочу передать массив b = array([[3,27.0],[2,9],[10,1]],order='F') в myfun в Python, но я получаю следующую ошибку

TypeError: Array must be contiguous.  A non-contiguous array was given. 

Что я делаю неправильно? Является ли двойной тип данных в моем %apply неверное утверждение?

1 ответ

Порядок Fortran (order='F') может быть проблемой, так как это противоположно порядку C, я не уверен, потому что я не могу найти четкое определение continguous vs non для numpy. Так что стоит попробовать:

b = array([[3,27.0],[2,9],[10,1]],order='C')

Также стоит попробовать

myfun( numpy.ascontiguousarray(b) )

Я нашел справочный документ NumPy Swig полезным, чтобы понять разницу между INPLACE_ а также IN_ typemaps. По сути, последний используется, когда функция c будет только читать, а не записывать, так как длинный ввод - это какая-то последовательность, которую SWIG-код сможет обработать. Первый указывает, что функция c запишет в массив, поэтому порядок в оригинальном контейнере должен совпадать.

Другие вопросы по тегам