之前用reshape直接用,没想到还有个order参数,今天整理一下。
Numpy中reshape函数的两种常见相关用法:
reshape(1,-1)转化成1行
reshape(2,-1)转换成两行
reshape(-1,1)转换成1列
reshape(-1,2)转化成两列
numpy.reshape(a, newshape, order=’C’)
a:array_like,即要重新形成的数组。
newshape:int或tuple的整数。新的形状应该与原始形状兼容。如果是整数,则结果将是该长度的1-D数组。一个形状维度可以是-1。在这种情况下,从数组的长度和其余维度推断该值。
order:{‘C’,‘F’,‘A’}可选。使用索引顺序读取a的元素,并按照索引顺序将元素放到变换后的的数组中。如果不进行order参数的设置,默认参数为C。
(1)“C”指的是用类C写的读/索引顺序的元素,最后一个维度变化最快,第一个维度变化最慢。以二维数组为例,简单来讲就是横着读,横着写,优先读/写一行。
(2)“F”是指用FORTRAN类索引顺序读/写元素,最后一个维度变化最慢,第一个维度变化最快。竖着读,竖着写,优先读/写一列。注意,“C”和“F”选项不考虑底层数组的内存布局,只引用索引的顺序。
(3)“A”选项所生成的数组的效果与原数组a的数据存储方式有关,如果数据是按照Fortran存储的话,它的生成效果与”F“相同,否则与“C”相同。
注意:'C’和’F’选项不考虑底层数组的内存布局,而只是参考索引的顺序。'A’意味着在Fortran类索引顺序中读/写元素,如果a 是Fortran 在内存中连续的,否则为C样顺序。
其实上面一堆太官方的话也没太看明白,直接看例子把。
随机生成4行3列的在0-10之间的数据
import numpy as np
r=np.random.randint(0,10,size=(4,3))
如下:
array([[5, 7, 2],
[4, 1, 8],
[0, 7, 6],
[0, 7, 1]])
reshape成3行4列:
先看order是C
r1 = r.reshape((3,4),order='C')
r1
Out[6]:
array([[5, 7, 2, 4],
[1, 8, 0, 7],
[6, 0, 7, 1]])
再看order是A
r3 = r.reshape((3,4),order='A')
r3
Out[10]:
array([[5, 7, 2, 4],
[1, 8, 0, 7],
[6, 0, 7, 1]])
完全一样。所以这个数据不是Fortran存储。
再看order是F
r2 = r.reshape((3,4),order='F')
r2
Out[8]:
array([[5, 0, 7, 8],
[4, 7, 7, 6],
[0, 1, 2, 1]])
通过例子可以看出来,F是优先对列信息进行操作,而C是优先行信息操作。
又看了看一维数据
a=np.arange(0,12)
a
Out[28]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
b=a.reshape((3,4),order='F')
b
Out[30]:
array([[ 0, 3, 6, 9],
[ 1, 4, 7, 10],
[ 2, 5, 8, 11]])
b[:,0]
Out[31]: array([0, 1, 2])
c=a.reshape((3,4),order='C')
c
Out[33]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
所以,F就是每取N个,按列放;C就是按行放。