Подтвердить что ты не робот

Установка порядка данных * по умолчанию * (C против Fortran) в Numpy

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

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

  • (A) Переупорядочить массивы, которые входят в код C с помощью .copy('F'), и изменить порядок тех, которые выходят с помощью .copy('C')
  • (B) Выясните, как получить numpy, чтобы "эмулировать" MATLAB, делая все в порядке Fortran от get-go.

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

4b9b3361

Ответ 1

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

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, поскольку у задания есть неявная копия.

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