【问题标题】:Setting the *default* data order (C vs. Fortran) in Numpy在 Numpy 中设置 *default* 数据​​顺序(C 与 Fortran)
【发布时间】:2011-12-16 04:45:17
【问题描述】:

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

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

  • (A).copy('F') 重新排列进入C 代码的数组,用.copy('C') 重新排列那些出来的数组
  • (B) 从一开始就按照 Fortran 顺序执行所有操作,弄清楚如何让 numpy “模拟” MATLAB。

选项 A(目前已实施)效果很好,但效率极低。有人知道如何使选项 B 起作用吗?

【问题讨论】:

标签: python matlab numpy mex


【解决方案1】:

我解决这个问题的方法(当我用 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   

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

但是,没有必要对来自 MEX 例程的 fortran 数组重新排序 - numpy 会非常透明地处理它们,只要它知道它们的顺序。

【讨论】:

  • PS:我也希望能够将numpy设置为默认为fortran顺序,但我认为这是不可能的。
猜你喜欢
  • 2017-10-28
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 2018-04-05
  • 2014-01-17
  • 1970-01-01
  • 2017-06-17
相关资源
最近更新 更多