python - 在 Numpy 中设置 *默认* 数据顺序(C 与 Fortran)

标签 python matlab numpy mex

我正在将一些 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 起作用吗?

最佳答案

我解决这个问题的方法(当我用 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 将非常透明地处理它们,只要它知道它们的顺序。

关于python - 在 Numpy 中设置 *默认* 数据顺序(C 与 Fortran),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7911041/

相关文章:

python - 使用 python 包装脚本在 upstart 中启动和停止 celery 进程

matlab - 期望最大化问题——如何在数据中找到最佳数量的高斯分布

python - 如何删除圆内的一组网格点?

python - 为什么 Pysnmp 在 Python 3 中将字节保存为字符串

python - Django:如何使用单选按钮将附加数据链接到选择?

python - Steam WebAPI 验证用户

matlab - 是否可以在 MATLAB 中强制对 LOAD 等文件操作区分大小写?

arrays - MATLAB 合并数组

python - 我需要安装 Excel 才能使用 Openpyxl "interactively"吗?它可以与 .ODS 格式交互吗?

python - Numpy:多维数组值内的比较