在Numpy中设置默认数据顺序(C vs. Fortran)

13

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

除了完全重写MEX代码以适应C顺序外,我可以:

  • (A) 使用.copy('F')重新排序进入C代码的数组,并使用.copy('C')重排出来的数组
  • (B) 弄清楚如何让numpy通过一开始就使用Fortran顺序来“模拟”MATLAB

目前实施的A选项运行良好,但效率极低。有人知道如何使选项B工作吗?


可能是重复问题:https://dev59.com/12sz5IYBdhLWcg3wv6ju - cyborg
@cyborg - 啊!你说得对。不过我觉得我的表达更清晰一些。希望上天眷顾我。 - BrianTheLion
1个回答

5

当我使用f2py包装fortran代码时,我的方法是显式声明所有相关的numpy数组按照fortran顺序排列,因为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   

我不确定这比你的解决方案A更有效率,因为赋值有一个隐式复制。

然而,没有必要重新排序从你的MEX例程中输出的Fortran数组 - 只要numpy知道它们的顺序,它就会非常透明地处理它们。


PS:我想将numpy设置为默认的Fortran顺序,但我认为这是不可能的。 - DaveP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接