Python np.nditer中的订单=';C';和标志=[';外部#u循环';]

Python np.nditer中的订单=';C';和标志=[';外部#u循环';],python,arrays,numpy,iterator,Python,Arrays,Numpy,Iterator,我正在研究Numpy,我有以下问题 如果我们这样做 a = np.arange(6).reshape(2,3) 然后 如果我们使用 for x in np.nditer(a,flags=['external_loop'],order='F'): print(x,end=' ') for x in np.nditer(a,flags=['external_loop'],order='C'): print(x,end=' ') 输出是 [0 3] [1 4] [2 5] [

我正在研究Numpy,我有以下问题

如果我们这样做

a = np.arange(6).reshape(2,3)
然后

如果我们使用

for x in np.nditer(a,flags=['external_loop'],order='F'):
    print(x,end=' ')
for x in np.nditer(a,flags=['external_loop'],order='C'):
    print(x,end=' ')
输出是

[0 3] [1 4] [2 5] 
[0 1 2 3 4 5] 
这是有道理的。但是如果我们使用

for x in np.nditer(a,flags=['external_loop'],order='F'):
    print(x,end=' ')
for x in np.nditer(a,flags=['external_loop'],order='C'):
    print(x,end=' ')
输出是

[0 3] [1 4] [2 5] 
[0 1 2 3 4 5] 
我无法解释。我本以为结果会是这样的

[0 1 2] [3 4 5]
Numpy是否将[0 1 2]和[3 4 5]合并,因为它们是连续存储在内存中的?

根据: 请注意,默认情况下保持本机内存顺序,迭代器可以提供单个一维块,而强制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
的顺序更改为
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]

是的,数组的数据缓冲区是一个连续的c`array。
nditer
如果继续在c或cython代码中使用,则主要是有价值的。我还没有看到它在python代码中提高性能的证据。所以不要花太多时间去掌握它。非常感谢。这就把事情弄清楚了一点。原始数组的存储顺序显然很重要。@NachiketGokhale这正是教程所说的。只要您在nditer中的顺序与数组的本机顺序相同,它将提供单个1-D元素数组。如果nditer的顺序不同于数组的顺序,那么它将返回每个1-D的块。