0%

python-numpy_条件布尔-变换操作

python-numpy

1.条件和布尔数组

从数组中选择性抽取元素的方法是使用条件表达式和布尔运算符

1
2
3
4
5
6
7
# 从由0到1之间的随机数组成的4×4型矩阵中选取所有小于0.5的元素。
A = np.random.random((44))
A
# array([[ 0.03536295,0.0035115 , 0.54742404,0.68960999],
# [ 0.21264709,0.17121982,0.81090212,0.43408927],
# [ 0.77116263,0.04523647,0.84632378,0.54450749],
# [0.86964585,0.6470581 , 0.42582897,0.22286282]])

创建随机数矩阵后,如果使用表示条件的运算符,比如这里的小于号,你将会得到由布尔值组成的数组。对于原数组中条件满足的元素,布尔数组中处于同等位置的元素为True。

1
2
3
4
5
A<0.5
# array([[ True,True,False,False],
# [ True,True,False, True],
# [False,True,False,False],
# [False,False,True,True]],dtype=bool)

实际上,从数组中选取一部分元素时,隐式地用到了布尔数组。其实,直接把条件表达式置于方括号中,也能抽取所有小于0.5的元素,组成一个新数组。

1
2
A[A<0.5]
# array([ 0.03536295, 0.0035115, 0.21264709, 0.17121982,0.43408927, 0.04523647, 0.42582897, 0.22286282])

2.形状变换

用reshape()函数把一维数组转换为矩阵。

reshape()函数返回一个新数组,因而可用来创建新对象。然而,如果想通过改变数组的形状来改变数组对象,需把表示新形状的元组直接赋给数组的shape属性。

由输出结果来看,上述操作改变了原始数组的形状,而没有返回新对象。改变数组形状的操作是可逆的,ravel()函数可以把二维数组再变回一维数组。

直接改变数据shape属性的值也可以

另外一种重要的运算是交换行列位置的矩阵转置。Numpy的transpose()函数实现了该功能

1
2
3
4
5
6
7
8
9
a.ravel()
#array([0.77841574,0.39654203,0.38188665,0.26704305,0.27519705,0.78115866,0.96019214,0.59328414,0.52008642,0.10862692,o.41894881,0.73581471])
a.shape()
#array([0.77841574,0.39654203,0.38188665,0.26704305,0.27519705,0.78115866,0.96019214,0.59328414,0.52008642,0.10862692,o.41894881,0.73581471])
a.transpose()
# array([[ 0.77841574,0.27519705, 0.52008642],
# [ 0.39654203,0.78115866,0.10862692],
# [0.38188665,0.96019214,0.41894881],
# [ 0.26704305,0.59328414,0.73581471]])

3.数组操作

  1. 连接数组

    多个数据库整合在一起形成一个包含这些数组的新数组(Numpy使用了栈这个概念,提供了几个运用栈概念的函数)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    # vstack()函数执行垂直入栈操作,把第二个数组作为行添加到第一个数组,数组朝垂直方向生长。相反,hstack()函数执行水平入栈操作,也就是说把第二个数组作为列添加到第一个数组。
    A= np. ones ((33))
    B= np. zeros((33))
    np.vstack((A,B))
    # array([[ 1.,1.,1.],
    # [ 1., 1., 1.],
    # [ 1., 1., 1.],
    # [ o., o., o.],
    # [ o., o., o.],
    # [ o., o., o.]])
    np.hstack((A,B))
    #array([[ 1., 1., 1., 0., 0., 0.],
    # [ 1., 1., 1., 0., 0., 0.],
    # [ 1., 1., 1., 0., 0., 0.]])

    #另外两个用于多个数组之间栈操作的函数是column_stack()和row_stack()。这两个函数不同于上面两个。一般来讲,这两个函数把一维数组作为列或行压入栈结构,以形成一个新的二维数组。
    a = np.array([0,1,2])
    b = np.array([3,4,5])
    C = np. array([6,7,8])
    np.column_stack((a, b,c))
    #array([[0,3,6],
    # [1,4,7],
    # [2,5,8]])
    np.row_stack((a, b,c))
    #array([[0,1,2],
    # [3,4,5],
    # [6,7,8]])
  2. 数组切分

    在NumPy中,该操作要用到切分方法。同理,我们也有一组函数,水平切分用hsplit()函数,垂直切分用vsplit()函数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    A = np.arange(16).reshape((44))
    # array([[ 0,1,2,3],
    # [ 4, 5,6,7],
    # [8,9,10,11],
    # [12,13,14,15]])

    #水平切分
    [B,C] = np.hsplit(A,2)
    B
    #array([[ 0,1],
    # [ 4,5],
    # [ 8,9],
    # [12,13]])
    C
    #array([[ 2,3],
    # [ 6,7],
    # [10,11],
    # [14,15]])

    #垂直切分
    >>>[B,c]= np.vsplit(A,2)
    B
    # array([[0,1,2,3],[4,5,6,7]])
    C
    # array([[ 8,9,10,11],[12,13,14,15]])

    split()函数更为复杂,可以把数组分为几个不对称的部分。此外,除了传入数组作为参数外,还得指定被切分部分的索引。如果指定axis=1项,索引为列索引;如果axis=0,索引为行索引。