书接上文
7.形状操作
数组形状由沿每条轴的元素数量决定。
>>> a = np.floor(10*np.random.random((3,4)))
>>> a
array([[7., 1., 6., 3.],
[9., 5., 7., 4.],
[2., 5., 0., 8.]])
>>> a.shape
(3, 4)
数组的形状可以用不同的指令来改变。下面的三个命令都返回一个新的数组,不改变原来的数组。
>>> b = a.ravel()
>>> b
array([7., 1., 6., 3., 9., 5., 7., 4., 2., 5., 0., 8.])
>>> b.shape
(12,)
>>> a.reshape(6,2)
array([[7., 1.],
[6., 3.],
[9., 5.],
[7., 4.],
[2., 5.],
[0., 8.]])
>>> a.T
array([[7., 9., 2.],
[1., 5., 5.],
[6., 7., 0.],
[3., 4., 8.]])
>>> a.T.shape
(4, 3)
>>> a.shape
(3, 4)
由ravel()生成的数组中的元素顺序通常是C格式的,a[0,0]后面跟着的就是a[0,1]。如果矩阵被reshape到其它形状,排列顺序也是C格式的。ravel和reshape函数通过参数可以使用FORTRAN格式的数组,即最左边的索引变化最快。
reshape函数返回修改后的形状作为参数,而ndarray.resize则修改数组本身。
>>> a
array([[7, 1, 6, 3],
[9, 5, 7, 4],
[2, 5, 0, 8]])
>>> a.resize((2,6))
>>> a
array([[7, 1, 6, 3, 9, 5],
[7, 4, 2, 5, 0, 8]])
如果在改变形状的操作中,有一个维度参数为-1,则其维度将会被自动计算。
>>> a.reshape(4,-1)
array([[7, 1, 6],
[3, 9, 5],
[7, 4, 2],
[5, 0, 8]])
8.组合不同数组
不同的数组可以沿着某一个轴堆叠在一起。
>>> a = np.floor(10*np.random.random((2,2)))
>>> a
array([[4., 8.],
[0., 1.]])
>>> b = np.floor(10*np.random.random((2,2)))
>>> b
array([[1., 3.],
[9., 7.]])
>>> np.vstack((a,b))
array([[4., 8.],
[0., 1.],
[1., 3.],
[9., 7.]])
>>> np.hstack((a,b))
array([[4., 8., 1., 3.],
[0., 1., 9., 7.]])
column_stack函数将1维数组作为列堆叠到2维数组中。它只有在2维数组的组合中与hstack相同。
>>> np.column_stack((a,b))
array([[4., 8., 1., 3.],
[0., 1., 9., 7.]])
>>> a = np.array([4,2])
>>> b = np.array([3,8])
>>> np.column_stack((a,b))
array([[4, 3],
[2, 8]])
>>> np.hstack((a,b))
array([4, 2, 3, 8])
>>> a[:,np.newaxis] #将数组转换成2维
array([[4],
[2]])
>>> np.column_stack((a[:,np.newaxis],b[:,np.newaxis]))
array([[4, 3],
[2, 8]])
>>> np.hstack((a[:,np.newaxis],b[:,np.newaxis]))
array([[4, 3],
[2, 8]])
对于任何形式输入的数组,row_stack的功能与vstack相同。对于超过两维的数组,hstack根据第二个轴进行组合,vstack根据第一个轴进行组合,concatenate允许有一个可选参数,该参数表示沿着指定的轴作组合。
在复杂情况下,r_和c_可通过一个轴创建数组,允许使用‘:’符号:
>>> np.r_[1:4,0,4]
array([1, 2, 3, 0, 4])
当使用数组作为参数时,r_和c_与vstack和hstack相似,但是有一个可选参数,表示沿着特定的轴连接数组。