numpy 合并数组和切割数组

一、合并数组

可以在不同的轴上堆积数组:

>>> 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还有一个concatenate方法,既可以垂直拼接也可以水平拼接,是通过axis参数进行区分,其工作机制比较难以理解和记忆,建议查看范例,对照使用:

>>> np.concatenate((a, b), axis=0)
array([[ 8.,  8.],
       [ 0.,  0.],
       [ 1.,  8.],
       [ 0.,  4.]])
>>> np.concatenate((a, b), axis=1)
array([[ 8.,  8.,  1.,  8.],
       [ 0.,  0.,  0.,  4.]])
>>>arr1 = np.array([1, 2, 3])

>>>arr2 = np.array([4, 5, 6])
>>> np.concatenate((arr1, arr2), axis=0)
array([1 2 3 4 5 6])

concatenate方法在合并的时候,两个数组必须处在同一维度,否则会报错。axis参数可以赋值的数值个数取决于数组的维度数。

重要提示:在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方法,对数组进行垂直方向的分割;也有split方法综合了两个方法的功能,可以指定分割的轴。

使用方式与上面的一致。

posted @ 2020-04-05 09:51  如心幻雨  阅读(1289)  评论(0编辑  收藏  举报