第五章 ndarray的重塑、组合和拆分

NumPy入门教程

第一章 NumPy 介绍
第二章 ndarray的创建及其属性
第三章 ndarray的基本操作
第四章 ndarray的索引、切片和遍历
第五章 ndarray的重塑、组合和拆分
第六章 用于ndarray的文件操作
第七章 ndarray的赋值、视图、拷贝和广播



前言

上一章我们讲述了 ndarray 的索引、切片和遍历。本节课我们来讲述 ndarray 的重塑、组合和拆分。


一、重塑

使用 numpy 提供的方法,我们可以改变 ndarray 的维度数,比如将一维的数组重塑成二维的数组,例如:

>>> import numpy as np
>>>
>>> my_arr1 = np.random.random(12)
>>>
>>> import numpy as np
>>>
>>> my_arr1 = np.random.random(12)
>>> my_arr1
array([0.42727055, 0.01135352, 0.95942564, 0.82604535, 0.74990442,
       0.73309327, 0.1192291 , 0.00639152, 0.7966674 , 0.42804322,
       0.64409396, 0.22151803])
>>>
>>> my_arr2 = my_arr1.reshape(3,4)
>>> my_arr2
array([[0.42727055, 0.01135352, 0.95942564, 0.82604535],
       [0.74990442, 0.73309327, 0.1192291 , 0.00639152],
       [0.7966674 , 0.42804322, 0.64409396, 0.22151803]])
>>> my_arr1
array([0.42727055, 0.01135352, 0.95942564, 0.82604535, 0.74990442,
       0.73309327, 0.1192291 , 0.00639152, 0.7966674 , 0.42804322,
       0.64409396, 0.22151803])

在上面的代码中,my_arr1 是一个含有 12 个元素的一维数组,我们使用 reshape() 函数将 my_arr1 重塑成一个 3 行 4 列的二维数组。这里有一点要注意的是,虽然我们对 my_arr1 调用了 reshape() 函数,但是 my_arr1 本身并没有发生改变,要想改变 my_arr1,我们可以这样做:

>>> import numpy as np
>>>
>>> my_arr1 = np.random.random(12)
>>> my_arr1
array([0.25357736, 0.81421707, 0.655927  , 0.79209248, 0.46244593,
       0.74311712, 0.11939986, 0.28750708, 0.80994986, 0.8389259 ,
       0.6753612 , 0.02988502])
>>>
>>> my_arr1.shape = (3, 4)
>>> my_arr1
array([[0.25357736, 0.81421707, 0.655927  , 0.79209248],
       [0.46244593, 0.74311712, 0.11939986, 0.28750708],
       [0.80994986, 0.8389259 , 0.6753612 , 0.02988502]])

在上面的代码中,我们直接将 my_arr1 的 shape 属性修改为 (3, 4),这样的话,my_arr1 的形状就发生了改变。如果想把发生形状改变后的 my_arr1 重新改成一维数组,我们可以使用 ravel() 函数。

>>> import numpy as np
>>>
>>> my_arr1 = np.random.random(12)
>>> my_arr1
array([0.86724697, 0.82570398, 0.84643175, 0.7967823 , 0.65365503,
       0.18411067, 0.40510171, 0.57981427, 0.61893108, 0.78610127,
       0.0212892 , 0.9064715 ])
>>>
>>> my_arr1.shape = (3, 4)
>>> my_arr1
array([[0.86724697, 0.82570398, 0.84643175, 0.7967823 ],
       [0.65365503, 0.18411067, 0.40510171, 0.57981427],
       [0.61893108, 0.78610127, 0.0212892 , 0.9064715 ]])
>>>
>>> my_arr1 = my_arr1.ravel()
>>> my_arr1
array([0.86724697, 0.82570398, 0.84643175, 0.7967823 , 0.65365503,
       0.18411067, 0.40510171, 0.57981427, 0.61893108, 0.78610127,
       0.0212892 , 0.9064715 ])

二、组合

上面讲述了 ndarray 的重塑,下面来讲下多个 ndarray 的组合。例如:

>>> import numpy as np
>>>
>>> my_arr1 = np.ones((3,3))
>>> my_arr2 = np.zeros((4,3))
>>>
>>> np.vstack((my_arr1, my_arr2))
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])

上面的代码将 my_arr1my_arr2 按照垂直方向进行组合,在组合时需要注意的是,当我们按垂直方向组合两个 ndarray 时,两个 ndarray 的列数需要相等,否则会报错。既然可以按照垂直方向进行组合,相应地,我们也可以按照水平方向进行组合。例如:

>>> import numpy as np
>>>
>>> my_arr1 = np.ones((3,3))
>>> my_arr2 = np.zeros((3,4))
>>>
>>> np.hstack((my_arr1, my_arr2))
array([[1., 1., 1., 0., 0., 0., 0.],
       [1., 1., 1., 0., 0., 0., 0.],
       [1., 1., 1., 0., 0., 0., 0.]])

上面的代码将 my_arr1my_arr2 按照水平方向进行组合,在组合时需要注意的是,当我们按水平方向组合两个 ndarray 时,两个 ndarray 的行数需要相等,否则会报错。
上面按垂直方向组合两个 ndarray 时,我们还有另外一种实现方法,例如:

>>> import numpy as np
>>>
>>> my_arr1 = np.ones((3,3))
>>> my_arr2 = np.zeros((4,3))
>>>
>>> np.row_stack((my_arr1, my_arr2))
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])

上面代码中的 row_stack() 函数的效果和 vstack() 函数的效果是一样的,在进行组合时,同样要注意两个 ndarray 的列数需要相等,否则会报错。同样的,上面按水平方向组合两个 ndarray 时,我们同样有另外一种实现方法,例如:

>>> import numpy as np
>>>
>>> my_arr1 = np.ones((3,3))
>>> my_arr2 = np.zeros((3,4))
>>>
>>> np.column_stack((my_arr1, my_arr2))
array([[1., 1., 1., 0., 0., 0., 0.],
       [1., 1., 1., 0., 0., 0., 0.],
       [1., 1., 1., 0., 0., 0., 0.]])

上面代码中的 column_stack() 函数的效果和 hstack() 函数的效果是一样的,在进行组合时,同样要注意两个 ndarray 的行数需要相等,否则会报错。上面讲的都是二维数组的组合,一维数组的组合是类似的,我们来举两个例子:

>>> import numpy as np
>>>
>>> my_arr1 = np.arange(0, 3)
>>> my_arr2 = np.arange(3, 6)
>>> my_arr3 = np.arange(6, 9)
>>>
>>> np.row_stack((my_arr1, my_arr2, my_arr3))
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> import numpy as np
>>>
>>> my_arr1 = np.arange(0, 3)
>>> my_arr2 = np.arange(3, 6)
>>> my_arr3 = np.arange(6, 9)
>>>
>>> np.column_stack((my_arr1, my_arr2, my_arr3))
array([[0, 3, 6],
       [1, 4, 7],
       [2, 5, 8]])

三、拆分

既然可以对 ndarray 进行组合,我们就可以对 ndarray 进行拆分。例如:

>>> import numpy as np
>>>
>>> my_arr1 = np.arange(0, 16).reshape((4, 4))
>>> [my_arr2, my_arr3] = np.hsplit(my_arr1, 2)
>>>
>>> my_arr2
array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13]])
>>> my_arr3
array([[ 2,  3],
       [ 6,  7],
       [10, 11],
       [14, 15]])

上面的代码对 my_arr1 进行拆分,拆分成 2 个 ndarray,my_arr1 是一个 4 行 4 列的二维数组,拆分成了 2 个 4 行 2 列 的二维数组。hsplit() 函数进行的是水平方向的拆分,同样的,我们可以进行垂直方向的拆分,例如:

>>> import numpy as np
>>>
>>> my_arr1 = np.arange(0, 16).reshape((4, 4))
>>> [my_arr2, my_arr3] = np.vsplit(my_arr1, 2)
>>>
>>> my_arr2
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])
>>> my_arr3
array([[ 8,  9, 10, 11],
       [12, 13, 14, 15]])

上面的代码进行了水平方向的拆分,将 4 行 4 列的二维数组 my_arr1 拆分成 2 个 2 行 4 列的二维数组。上面进行的拆分是平分,更进一步我们可以指定拆分的位置。例如:

>>> import numpy as np
>>>
>>> my_arr1 = np.arange(0, 16).reshape((4, 4))
>>> [my_arr2, my_arr3, my_arr4] = np.split(my_arr1, [1, 3], axis=1)
>>>
>>> my_arr2
array([[ 0],
       [ 4],
       [ 8],
       [12]])
>>> my_arr3
array([[ 1,  2],
       [ 5,  6],
       [ 9, 10],
       [13, 14]])
>>> my_arr4
array([[ 3],
       [ 7],
       [11],
       [15]])

上面代码指定的拆分位置为第 1 列和第 3 列,于是将一个 4 行 4 列的二维数组拆分成 3 个数组,分别是 4 行 1 列、4 行 2 列、4 行 1列。上面指定的是列的拆分位置,同样的,我们可以指定行的拆分位置,例如:

>>> import numpy as np
>>>
>>> my_arr1 = np.arange(0, 16).reshape((4, 4))
>>> [my_arr2, my_arr3, my_arr4] = np.split(my_arr1, [1, 3], axis=0)
>>>
>>> my_arr2
array([[0, 1, 2, 3]])
>>> my_arr3
array([[ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> my_arr4
array([[12, 13, 14, 15]])

上面代码指定的拆分位置为第 1 行和第 3 行,于是将一个 4 行 4 列的二维数组拆分成 3 个数组,分别是 1 行 4 列、2 行 4 列、1 行 4 列。


总结

本章介绍了ndarray的重塑、组合和拆分。

上一章 ndarray的索引、切片和遍历
下一章 用于 ndarray 的文件操作

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值