在Numpy中设置*default*数据顺序(C vs. Fortran)

Bri*_*ion 11 python matlab numpy mex

我正在将一些MATLAB代码移植到Numpy.此任务包括从某些C++代码中剥离MEX并将其替换为对Numpy的C-API的等效调用.一个问题是MEX代码将传入数据视为Fortran有序,因为这是MATLAB对其数组进行排序的方式.另一方面,Numpy默认使用C排序.

如果没有完全重写用于C排序的MEX代码,我可以:

  • (A)对进入C代码的数组进行重新排序,.copy('F')然后重新排序.copy('C')
  • (B)弄清楚如何通过从一开始就以Fortran顺序执行所有操作来"模仿"MATLAB.

选项A - 目前已实施 - 工作得很好,但非常低效.有谁知道如何使选项B工作?

Dav*_*veP 5

我解决这个问题的方法(当我用 f2py 包装 fortran 代码时)是按 fortran 顺序显式声明所有相关的 numpy 数组,因为 numpy 可以愉快地透明地使用它们,甚至可以很好地结合 fortran 和 C 顺序数组。不幸的是,numpy 运算似乎不保留 fortran 顺序。因此,您应该预先分配目标数组,这些数组将以 Fortran 顺序传递给 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   
Run Code Online (Sandbox Code Playgroud)

我不确定这是否比您的解决方案 A 更有效,因为分配有一个隐式副本。

然而,应该不需要重新排序来自 MEX 例程的 Fortran 数组 - numpy 会非常透明地处理它们,只要它知道它们的顺序。