Установка порядка данных * по умолчанию (C против Fortran) в Numpy - PullRequest
11 голосов
/ 27 октября 2011

Я портирую код MATLAB на Numpy.Эта задача включает в себя удаление MEX из некоторого кода C ++ и его замену эквивалентными вызовами C-API Numpy.Одна проблема заключается в том, что код MEX обрабатывает входящие данные как упорядоченные по Фортрану, потому что именно так MATLAB упорядочивает свои массивы.Numpy, с другой стороны, по умолчанию использует порядок C.

Если полностью переписать код MEX для порядка C, я могу:

  • (A) Переупорядочьте массивы, которые входят в код C, с помощью .copy('F') и измените порядок следования массивов, которые выходят с .copy('C')
  • (B) .эмулируйте "MATLAB, выполняя все в порядке Фортрана с самого начала.

Опция A - в настоящее время реализована - работает просто отлично, но ужасно неэффективно.Кто-нибудь знает, как заставить работать вариант B?

1 Ответ

4 голосов
/ 27 октября 2011

Мой подход к этой проблеме (когда я оборачиваю код fortran с помощью f2py) состоит в том, чтобы явно объявить все соответствующие массивы numpy в порядке fortran, потому что numpy может счастливо работать с ними прозрачно, и он даже хорошо работает, комбинируя массивы порядка fortran и C , К сожалению, кажется, что обалденные операции не сохраняют порядок Фортрана. Поэтому вам следует предварительно выделить массивы назначения, которые будут переданы в MEX в следующем порядке, например:

A = np.empty((10, 10))
B = np.empty((10,2))
# fill A and B with the data you want

C = np.empty((10, 2), order='F')
C[:] = np.dot(A, B) # note that this index is essential
# C is then passed to your MEX routine   

Я не уверен, что это намного эффективнее, чем ваше решение A, поскольку у назначения есть неявная копия.

Однако не нужно переупорядочивать массивы фортранов, выходящие из вашей процедуры MEX - numpy будет работать с ними совершенно прозрачно, если знает, в каком порядке они находятся.

...