更多关于:NumPy…
更改数组形状
数组具有由沿着每个轴的元素数量给出的形状:
››› a = np.floor(10*np.random.random((3,4))) ››› a array([[ 6., 7., 2., 0.], [ 6., 2., 0., 9.], [ 3., 9., 3., 8.]]) ››› a.shape (3L, 4L)
上面生成了一个 3×4 的数组,现在对它进行形状的改变。
››› a.ravel() # 进行平铺 array([ 6., 7., 2., 0., 6., 2., 0., 9., 3., 9., 3., 8.]) ››› a.reshape(2, 6) # 重塑成 2x6 array([[ 6., 7., 2., 0., 6., 2.], [ 0., 9., 3., 9., 3., 8.]]) ››› a.T # 转置 array([[ 6., 6., 3.], [ 7., 2., 9.], [ 2., 0., 3.], [ 0., 9., 8.]]) ››› a.shape (3L, 4L)
无论是ravel
、reshape
、T
,它们都不会更改原有的数组形状,都是返回一个新的数组。
使用 resize
方法可以直接修改数组本身:
››› a array([[ 6., 7., 2., 0.], [ 6., 2., 0., 9.], [ 3., 9., 3., 8.]]) ››› a.resize(2, 6) ››› a array([[ 6., 7., 2., 0., 6., 2.], [ 0., 9., 3., 9., 3., 8.]])
技巧:在使用 reshape
时,可以将其中的一个维度指定为 -1,Numpy 会自动计算出它的真实值
››› a.reshape(3, -1) array([[ 6., 7., 2., 0.], [ 6., 2., 0., 9.], [ 3., 9., 3., 8.]])
将不同数组堆叠在一起
除了可以对单个数组的形状进行转换外,还可以把多个数据进行堆叠。
››› a = np.floor(10*np.random.random((2,2))) ››› a array([[ 9., 9.], [ 8., 1.]]) ››› b = np.floor(10*np.random.random((2,2))) ››› b array([[ 5., 2.], [ 9., 5.]]) ››› np.vstack((a,b)) array([[ 9., 9.], [ 8., 1.], [ 5., 2.], [ 9., 5.]]) ››› np.hstack((a,b)) array([[ 9., 9., 5., 2.], [ 8., 1., 9., 5.]])
对于2D数组来说,使用hstack
和column_stack
效果一样,对于1D数组来说,column_stack
会将1D数组作为列堆叠到2D数组中:
››› from numpy import newaxis ››› np.column_stack((a,b)) # with 2D arrays array([[ 4., 3.], [ 2., 8.]]) ››› a = np.array([4.,2.]) ››› b = np.array([3.,8.]) ››› np.column_stack((a,b)) array([[ 4., 3.], [ 2., 8.]]) ››› np.hstack((a,b)) # 一维数组的情况下,column_stack和hstack结果不一样 array([ 4., 2., 3., 8.]) ››› a[:,newaxis] # 将一维数组转为二维数组 array([[ 4.], [ 2.]]) ››› np.column_stack((a[:,newaxis],b[:,newaxis])) array([[ 4., 3.], [ 2., 8.]]) ››› np.hstack((a[:,newaxis],b[:,newaxis])) # 二维数组的情况下,column_stack和hstack结果一样 array([[ 4., 3.], [ 2., 8.]])
另一方面,对于任何输入数组,函数row_stack
等效于vstack
。
一般来说,对于具有两个以上维度的数组,hstack
沿第二轴堆叠,vstack
沿第一轴堆叠,concatenate
允许一个可选参数,给出串接应该发生的轴。
将一个数组分成几个较小的数组
既然可以将多个数组进行对堆叠,自然也可以将一个数组拆分成多个小数组。
使用hsplit
,可以沿其水平轴拆分数组,通过指定要返回的均匀划分的数组数量,或通过指定要在其后进行划分的列:
››› from pprint import pprint ››› a = np.floor(10*np.random.random((2,12))) ››› a array([[ 9., 3., 4., 1., 0., 0., 6., 7., 3., 4., 1., 1.], [ 1., 2., 8., 1., 0., 2., 1., 4., 3., 8., 1., 1.]]) ››› pprint(np.hsplit(a,3)) # 水平切成3等份 [array([[ 9., 3., 4., 1.], [ 1., 2., 8., 1.]]), array([[ 0., 0., 6., 7.], [ 0., 2., 1., 4.]]), array([[ 3., 4., 1., 1.], [ 3., 8., 1., 1.]])]
vsplit
沿垂直轴分割,array_split
允许指定沿哪个轴分割。