一、合并数组
可以在不同的轴上堆积数组:
>>> a = np.floor(10*np.random.random((2,2)))
>>> a
array([[ 8., 8.],
[ 0., 0.]])
>>> b = np.floor(10*np.random.random((2,2)))
>>> b
array([[ 1., 8.],
[ 0., 4.]])
>>> np.vstack((a,b))
array([[ 8., 8.],
[ 0., 0.],
[ 1., 8.],
[ 0., 4.]])
>>> np.hstack((a,b))
array([[ 8., 8., 1., 8.],
[ 0., 0., 0., 4.]])
注意:
- 不同于reshape方法,vstack和hstack是numpy级别的功能,不能通过数组对象来调用
- v和h实际上就是垂直方向和水平方向,英文字母
- 参数要以元组的方式提供
numpy还有一个column_stack方法,其工作机制比较难以理解和记忆,建议查看范例,对照使用:
>>> from numpy import newaxis # 引入一个新轴
>>> np.column_stack((a,b))
array([[ 8., 8., 1., 8.],
[ 0., 0., 0., 4.]])
>>> 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[:,newaxis] # 为a添加一个轴
array([[ 4.],
[ 2.]])
>>> np.column_stack((a[:,newaxis],b[:,newaxis]))
array([[ 4., 3.],
[ 2., 8.]])
>>> np.hstack((a[:,newaxis],b[:,newaxis])) # 但这时结果是一样的
array([[ 4., 3.],
[ 2., 8.]])
重要提示:在numpy中,一维和多维,垂直和水平,不同的操作可能产生完全不同的结果和逻辑,这点不但新手容易迷惑,老手也经常出问题。最好的办法是现用现查,或者写个例子测试一下!
二、切割数组
使用hsplit,可以沿着数组的水平轴拆分数组,方法是指定要返回的相等形状数组的数目,或者指定在其后面进行拆分的列:
>>> a = np.floor(10*np.random.random((2,12)))
>>> a
array([[ 9., 5., 6., 3., 6., 8., 0., 7., 9., 7., 2., 7.],
[ 1., 4., 9., 2., 2., 1., 0., 6., 2., 2., 4., 0.]])
>>> np.hsplit(a,3) # 将数据均匀分割成3份
[array([[ 9., 5., 6., 3.],
[ 1., 4., 9., 2.]]), array([[ 6., 8., 0., 7.],
[ 2., 1., 0., 6.]]), array([[ 9., 7., 2., 7.],
[ 2., 2., 4., 0.]])]
>>> np.hsplit(a,(3,4)) # 在指定的列位置,分割数组
[array([[ 9., 5., 6.],
[ 1., 4., 9.]]), array([[ 3.],
[ 2.]]), array([[ 6., 8., 0., 7., 9., 7., 2., 7.],
[ 2., 1., 0., 6., 2., 2., 4., 0.]])]
显然有vsplit方法,对数组进行垂直方向的分割;也有array_split方法综合了两个方法的功能,可以指定分割的轴。
使用方式与上面的一致。