python - 在 np.nditer 中为 order='C' 和 flags=['external_loop'] 排序
问题描述
我正在学习 Numpy教程,我有以下问题。
如果我们这样做
a = np.arange(6).reshape(2,3)
然后
a=array([[0, 1, 2],
[3, 4, 5]])
如果我们使用 Fortran 顺序遍历数组
for x in np.nditer(a,flags=['external_loop'],order='F'):
print(x,end=' ')
输出是
[0 3] [1 4] [2 5]
这是有道理的。但是如果我们按C
顺序迭代使用
for x in np.nditer(a,flags=['external_loop'],order='C'):
print(x,end=' ')
输出是
[0 1 2 3 4 5]
我无法解释。我本来希望输出是
[0 1 2] [3 4 5]
Numpy 是否将 [0 1 2] 和 [3 4 5] 组合在一起,因为它们连续存储在内存中?
解决方案
根据python doc: 观察到默认情况下保持本机内存顺序,迭代器能够提供单个一维块,而在强制 Fortran 顺序时,它必须提供三个块,每个块有两个元素。
为了更好地理解数组顺序的重要性,请查看以下示例:
a = np.arange(6).reshape(2,3)
#by default `a` is of order `C`
for x in np.nditer(a,flags=['external_loop'],order='F'):
print(x,end=' ')
#[0 3] [1 4] [2 5]
for x in np.nditer(a,flags=['external_loop'],order='C'):
print(x,end=' ')
#[0 1 2 3 4 5]
现在,我们改变a
to的顺序,F
看看会发生什么:
a = np.array(a,order='F')
for x in np.nditer(a,flags=['external_loop'],order='F'):
print(x,end=' ')
#[0 3 1 4 2 5]
for x in np.nditer(a,flags=['external_loop'],order='C'):
print(x,end=' ')
#[0 1 2] [3 4 5]
推荐阅读
- loops - 如何在 Pygame 中与两个精灵发生碰撞?如何继续 Sprite 循环?
- javascript - 从自定义目录文件创建 webpack 包
- libreoffice-calc - LibreOffice 基本版中的 Instr 函数不区分大小写?
- java - 如何从 SMSC 标头中检索可选参数(即 SAR_MSG_REF_NUM、SAR_SEGMENT_SEQNUM、SAR_TOTAL_SEGMENTS)我们正在使用 JSMPP jar
- python-3.x - 在 pandas 中删除数据透视数据框的项目表单级别
- spring - HttpStatus 代码 499 在 Spring HttpStatus 类中不可用
- javascript - ejs 表单重定向到 URL 的双重副本(express.js)
- angular - 在 Angular 中显示一段时间内生成的选定错误消息
- sql-server - SQL Server:FK 关系为子显示,但不为父显示
- javascript - 查询canvas函数中的问题