numpy之reshape

reshape

之前用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就是按行放。

你可能感兴趣的:(python基础,python)