先引入一个代码实例:
import numpy as np
x1 = np.array(
[[[ 1 , 0],
[ 3 , 2],
[ 5 , 4]],
[[ 7 , 6],
[ 9 , 8],
[11, 10]],
[[12 ,13],
[14 ,15],
[16 ,17]]]).reshape(3,2,3,order='C')
x = np.array(
[[[ 1 , 0],
[ 3 , 2],
[ 5 , 4]],
[[ 7 , 6],
[ 9 , 8],
[11, 10]],
[[12 ,13],
[14 ,15],
[16 ,17]]]).reshape(3,2,3).swapaxes(1,2)
y=np.ravel(x, order='C')
n=np.ravel(x, order='F')
z=np.ravel(x, order='K')
m=np.ravel(x, order='A')
z1=np.ravel(x1,order='K')
print('reshape:n',x1)
print('swapaxe:n',x)
print('order=C:',y)
print('order=F:',n)
print('order=K:',z)
print('order=A:',m)
print(z1)
#################################################
output:
reshape:
[[[ 1 0 3]
[ 2 5 4]]
[[ 7 6 9]
[ 8 11 10]]
[[12 13 14]
[15 16 17]]]
swapaxe:
[[[ 1 2]
[ 0 5]
[ 3 4]]
[[ 7 8]
[ 6 11]
[ 9 10]]
[[12 15]
[13 16]
[14 17]]]
order=C: [ 1 2 0 5 3 4 7 8 6 11 9 10 12 15 13 16 14 17]
order=F: [ 1 7 12 0 6 13 3 9 14 2 8 15 5 11 16 4 10 17]
order=K: [ 1 0 3 2 5 4 7 6 9 8 11 10 12 13 14 15 16 17]
order=A: [ 1 2 0 5 3 4 7 8 6 11 9 10 12 15 13 16 14 17]
[ 1 0 3 2 5 4 7 6 9 8 11 10 12 13 14 15 16 17]
从这个例子去理解order的作用:
首先明确一个概念:多维数组的indexing和内存布局是两回事
即一个数组可以由多种索引方式去读取(按行读取 or 按列读取),但该数组在内存布局中只有一种存储方式(按行存储 or 按列存储)
明确了这个概念以后,还需要知道这里的swapaxes()就只是改变了数组的视图(view),其内存布局并没有改变,x的内存布局是由reshape中的order确定的默认为’C’,即按行存储(这里reshape工作流程是使用按行索引顺序读取前面数组的元素,并使用此索引顺序将这些元素放入重构的数组中(再按行存储)。)
所以x的元素实际在内存布局中的顺序为 1,0,3,2,5,4…
ravel中的order就是改变索引的方式即改变读取的方式
‘C’:按行去读取x数组
‘F’:按列去读取x数组
‘K’:按内存布局中的顺序读取
‘A’:根据reshape时使用的顺序读取即’C’序读取



