文章目录
- 1. 更改数组的形状
- 2. 将不同数组堆叠在一起
- 3. 将一个数组分成几个较小的数组
1. 更改数组的形状
>>> import numpy as np
>>> a = np.floor(10*np.random.random((3,4)))
>>> a
array([[2., 2., 5., 6.],[2., 7., 4., 2.],[9., 3., 5., 8.]])
>>> a.shape
(3, 4)
数组的形状可通过各种命令更改。请注意,以下三个命令都返回修改后新的数组,原始数组不变:
ravel()、reshape(m,n)、T
>>> a.ravel() # ravel拆开的意思,展平数组
array([2., 2., 5., 6., 2., 7., 4., 2., 9., 3., 5., 8.])
>>> a.reshape(6,2) #返回新的修改行数列数后的数组
array([[2., 2.],[5., 6.],[2., 7.],[4., 2.],[9., 3.],[5., 8.]])
>>> a.T #行列互换,转置
array([[2., 2., 9.],[2., 7., 3.],[5., 4., 5.],[6., 2., 8.]])
>>> a.T.shape
(4, 3)
>>> a.shape
(3, 4)
下面这段话不明白:
由ravel()产生的数组中元素的顺序通常是“C风格”,也就是说,最右边的索引“改变最快”,所以[0,0]之后的元素是[0,1] 。如果数组被重新塑造成其他形状,数组又被视为“C-style”。NumPy通常创建按此顺序存储的数组,因此ravel()通常不需要复制其参数,但如果数组是通过切片另一个数组或使用不寻常选项创建的,则可能需要复制它。函数ravel()和reshape()也可以通过使用可选参数来指示使用FORTRAN风格的数组,其中最左侧的索引更改速度最快。
- reshape(m,n) 函数返回具有修改形状的参数,而 ndarray.resize((m,n)) 方法修改原始数组
>>> a
array([[2., 2., 5., 6.],[2., 7., 4., 2.],[9., 3., 5., 8.]])>>> a.resize((2,6))
>>> a
array([[2., 2., 5., 6., 2., 7.],[4., 2., 9., 3., 5., 8.]])
- 如果在reshape(m,n)操作中将维度指定为-1,则会自动计算该维度
>>> a.reshape(3,-1) #不想算的维度设置成-1,偷懒
array([[2., 2., 5., 6.],[2., 7., 4., 2.],[9., 3., 5., 8.]])
>>> a.reshape(-1,3)
array([[2., 2., 5.],[6., 2., 7.],[4., 2., 9.],[3., 5., 8.]])
2. 将不同数组堆叠在一起
- 几个数组可以沿不同的轴堆叠在一起
>>> a = np.floor(10*np.random.random((2,2)))
>>> a
array([[5., 7.],[6., 0.]])>>> b = np.floor(10*np.random.random((2,2)))
>>> b
array([[1., 5.],[1., 5.]])>>> np.vstack((a,b)) # v 垂向叠加
array([[5., 7.],[6., 0.],[1., 5.],[1., 5.]])>>> np.hstack((b,a)) # h 水平叠加
array([[1., 5., 5., 7.],[1., 5., 6., 0.]])
- 函数
column_stack
将1D数组作为列叠加到2D数组中。它相当于仅用于二维数组的hstack
>>> from numpy import newaxis
>>> np.column_stack((a,b))
array([[5., 7., 1., 5.],[6., 0., 1., 5.]])>>> a = np.array([4,2])
>>> b = np.array([3,9])>>> np.column_stack((a,b))
array([[4, 3], # a、b 作为 列 向量[2, 9]])>>> np.hstack((a,b))
array([4, 2, 3, 9])>>> a[:,newaxis] # 加入新的轴
array([[4],[2]])>>> np.column_stack((a[:,newaxis],b[:,newaxis]))
array([[4, 3],[2, 9]])
>>> np.hstack((a[:,newaxis],b[:,newaxis])) #两者结果一样
array([[4, 3],[2, 9]])
- 函数
row_stack
相当于vstack
。一般来说,对于具有两个以上维度的数组,hstack
沿第二轴堆叠,vstack
沿第一轴堆叠,concatenate
允许一个可选参数,给出串接应该发生的轴。
在复杂情况下,r_
和 c_
可用于通过沿一个轴叠加数字来创建数组。它们允许使用范围字面量(“:”)
>>> np.r_[1:5,8,9]
array([1, 2, 3, 4, 8, 9])>>> np.c_[1:3,[8,9], [10,11]]
array([[ 1, 8, 10],[ 2, 9, 11]])
3. 将一个数组分成几个较小的数组
- 使用
hsplit
,可沿水平轴拆分,通过指定要返回的均匀划分的数组数量,或指定要在其后进行划分的列
>>> a = np.floor(10*np.random.random((2,12)))
>>> a
array([[8., 9., 8., 8., 9., 9., 3., 6., 2., 3., 3., 1.],[2., 5., 8., 5., 9., 2., 1., 3., 6., 1., 6., 8.]])
>>> np.hsplit(a,3) # 将 a 分成3份
[array([[8., 9., 8., 8.],[2., 5., 8., 5.]]), array([[9., 9., 3., 6.],[9., 2., 1., 3.]]), array([[2., 3., 3., 1.],[6., 1., 6., 8.]])]
>>> np.hsplit(a,(3,4))
[array([[8., 9., 8.],[2., 5., 8.]]), array([[8.],[5.]]), array([[9., 9., 3., 6., 2., 3., 3., 1.],[9., 2., 1., 3., 6., 1., 6., 8.]])]
>>> np.hsplit(a,(3,5)) # 把3,4列划出来
[array([[8., 9., 8.],[2., 5., 8.]]), array([[8., 9.],[5., 9.]]), array([[9., 3., 6., 2., 3., 3., 1.],[2., 1., 3., 6., 1., 6., 8.]])]
vsplit
沿纵轴分割,并且array_split
允许指定沿哪个轴分割。
>>> a
array([[8., 9., 8., 8., 9., 9.],[3., 6., 2., 3., 3., 1.],[2., 5., 8., 5., 9., 2.],[1., 3., 6., 1., 6., 8.]])
>>> np.vsplit(a,(2,4)) # 把2,3行划出来
[array([[8., 9., 8., 8., 9., 9.],[3., 6., 2., 3., 3., 1.]]), array([[2., 5., 8., 5., 9., 2.],[1., 3., 6., 1., 6., 8.]]), array([], shape=(0, 6), dtype=float64)]
>>> np.vsplit(a,(2,3)) # 把2行划出来
[array([[8., 9., 8., 8., 9., 9.],[3., 6., 2., 3., 3., 1.]]), array([[2., 5., 8., 5., 9., 2.]]), array([[1., 3., 6., 1., 6., 8.]])]