NumPy之二:数组形状操作

来源:互联网 发布:淘宝手机版店招制作 编辑:程序博客网 时间:2024/05/19 20:46

    • 改变数组形状
    • 数组堆叠
    • 分离数组

1. 改变数组形状

给定了每个axis上元素的数量,一个数组的形状就固定了。

>>> a = np.floor(10*np.random.random((3,4)))>>> aarray([[ 2.,  8.,  0.,  6.],       [ 4.,  5.,  1.,  1.],       [ 8.,  9.,  3.,  6.]])>>> a.shape(3, 4)

通过一些命令,我们可以改变数组的形状:

>>> a.ravel() # flatten the arrayarray([ 2.,  8.,  0.,  6.,  4.,  5.,  1.,  1.,  8.,  9.,  3.,  6.])>>> a.shape = (6, 2)>>> a.Tarray([[ 2.,  0.,  4.,  1.,  8.,  3.],       [ 8.,  6.,  5.,  1.,  9.,  6.]])

reshape函数返回其参数指定的形状的数组,而ndarray.resize方法则会直接修改数组本身:

>>> aarray([[ 2.,  8.],       [ 0.,  6.],       [ 4.,  5.],       [ 1.,  1.],       [ 8.,  9.],       [ 3.,  6.]])>>> a.resize((2,6))>>> aarray([[ 2.,  8.,  0.,  6.,  4.,  5.],       [ 1.,  1.,  8.,  9.,  3.,  6.]])

如果在reshape操作中,某个维指定为-1,则其他维会自动计算

>>> carray([[[  0,   1,   2],        [ 10,  12,  13]],       [[100, 101, 102],        [110, 112, 113]]])>>> c.shape(2, 2, 3)>>> c.reshape(3,-1)array([[  0,   1,   2,  10],       [ 12,  13, 100, 101],       [102, 110, 112, 113]])>>> c.reshape(3,2,-1)array([[[  0,   1],        [  2,  10]],       [[ 12,  13],        [100, 101]],       [[102, 110],        [112, 113]]])>>> c.reshape(3,-1,2)array([[[  0,   1],        [  2,  10]],       [[ 12,  13],        [100, 101]],       [[102, 110],        [112, 113]]])

2. 数组堆叠

一些数组可以沿着不同的axis进行堆叠。

>>> a = np.floor(10*np.random.random((2,2)))>>> aarray([[ 8.,  8.],       [ 0.,  0.]])>>> b = np.floor(10*np.random.random((2,2)))>>> barray([[ 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.]])

函数column_stack可以将一维数组作为列堆叠到二维数组上。一维数组会先被转化成二维的列数组。

>>> from numpy import newaxis>>> aarray([[ 5.,  4.],       [ 8.,  7.]])>>> zarray([20, 30])>>> np.column_stack((a,z))array([[  5.,   4.,  20.],       [  8.,   7.,  30.]])

等价于以下过程

>>> aarray([[ 5.,  4.],       [ 8.,  7.]])>>> zarray([20, 30])>>> z = z[ : , newaxis]>>> zarray([[20],       [30]])>>> np.hstack((a,z))array([[  5.,   4.,  20.],       [  8.,   7.,  30.]])

当然,column_stack也可以作用于两个多维数组,等价于hstack.

>>> np.column_stack((a,b))   # With 2D arraysarray([[ 8.,  8.,  1.,  8.],       [ 0.,  0.,  0.,  4.]])>>> a = np.array([4.,2.])>>> b = np.array([2.,8.])>>> a[:,newaxis]  # This allows to have a 2D columns vectorarray([[ 4.],       [ 2.]])>>> np.column_stack((a[:,newaxis],b[:,newaxis]))array([[ 4.,  2.],       [ 2.,  8.]])>>> np.vstack((a[:,newaxis],b[:,newaxis])) # The behavior of vstack is differentarray([[ 4.],       [ 2.],       [ 2.],       [ 8.]])

对于多于二维的数组,hstack沿着数组第二个axis进行堆叠,vstack沿着第一个axis堆叠。concatenate函数允许指定axis进行堆叠,比如numpy.concatenate((a1, a2, …), axis=0)

在复杂点的例子中,r_ 和 c_ 对通过堆叠创建数组是很有用的。它们允许使用区间功能“:”:

>>> np.r_[1:4,0,4]array([1, 2, 3, 0, 4])

如果使用数组作为参数,r_ 和 c_ 默认情况下和vstack和hstack很相似,但他们允许使用一个可选参数来指定axis进行堆叠。

3. 分离数组

使用hsplit函数,可以将一个数组沿着其横轴切分开,可以指定返回的特定形状的数组数量,或者指定分界应该出现在哪些列上(注意列不是索引,列从1开始计数):

>>> a = np.floor(10*np.random.random((2,12)))>>> aarray([[ 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)   # Split a into 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))   # Split a after the third and the fourth column[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函数则可以指定要沿着哪个轴(axis)切割。

0 0
原创粉丝点击