python-numpy
1.条件和布尔数组
从数组中选择性抽取元素的方法是使用条件表达式和布尔运算符
1 | # 从由0到1之间的随机数组成的4×4型矩阵中选取所有小于0.5的元素。 |
创建随机数矩阵后,如果使用表示条件的运算符,比如这里的小于号,你将会得到由布尔值组成的数组。对于原数组中条件满足的元素,布尔数组中处于同等位置的元素为True。
1 | A<0.5 |
实际上,从数组中选取一部分元素时,隐式地用到了布尔数组。其实,直接把条件表达式置于方括号中,也能抽取所有小于0.5的元素,组成一个新数组。
1 | A[A<0.5] |
2.形状变换
用reshape()函数把一维数组转换为矩阵。
reshape()函数返回一个新数组,因而可用来创建新对象。然而,如果想通过改变数组的形状来改变数组对象,需把表示新形状的元组直接赋给数组的shape属性。
由输出结果来看,上述操作改变了原始数组的形状,而没有返回新对象。改变数组形状的操作是可逆的,ravel()函数可以把二维数组再变回一维数组。
直接改变数据shape属性的值也可以
另外一种重要的运算是交换行列位置的矩阵转置。Numpy的transpose()函数实现了该功能
1 | a.ravel() |
3.数组操作
连接数组
多个数据库整合在一起形成一个包含这些数组的新数组(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 ((3,3))
B= np. zeros((3,3))
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]])数组切分
在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
25A = np.arange(16).reshape((4,4))
# 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,索引为行索引。