Как передать 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 запишет в массив, поэтому порядок в оригинальном контейнере должен совпадать.