首页 > 解决方案 > 在 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] 组合在一起,因为它们连续存储在内存中?

标签: pythonarraysnumpyiterator

解决方案


根据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]

现在,我们改变ato的顺序,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]

推荐阅读