使用数组进行面向数组编程

使用Numpy数组可以使用简单数组表达式而无需写大量循环。这种利用数组表达式来替代显式循环的方法称为向量化。通常向量化会快上一到两个数量级。

将条件逻辑作为数组操作

numpy.where函数是三元表达式x if condition else y的向量化版本

1
2
3
4
5
arr1 = np.array([1.1,1.2,1.3,1.4,1.5])
arr2 = np.array([2.1,2.2,2.3,2.4,2.5])
cond = np.array([True, False, True, True, False])
print(np.where(cond,arr1,arr2)) ==>
[1.1 2.2 1.3 1.4 2.5]

这里所作的工作是:当cond里对应的值是True时输出arr1中对应的值,否则arr2。不难发现,np.where的用法实质上和C语言中的三目运算符有点相像

np.where的第二第三个参数也可以是标量。where一个典型用法就是根据一个数组来生成一个新的数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
arr = np.random.randn(4,4)
print(arr) ==>
[[ 0.29572971 0.19963891 -0.52207866 -0.21636118]
[-0.06288177 -2.09523842 -0.29574302 0.55874392]
[-0.53068276 -1.33698774 -0.57620167 -0.56706188]
[-0.13689203 0.81749388 -1.58993242 0.5219937 ]]
print(arr>0) ==>
[[ True True False False]
[False False False True]
[False False False False]
[False True False True]]
print(np.where(arr > 0, 2, -2 )) ==>
[[ 2 2 -2 -2]
[-2 -2 -2 2]
[-2 -2 -2 -2]
[-2 2 -2 2]]

这里做的是负数变-2,正数变2。通过观察不难发现,where第一项为true则执行第二项,否则第三项

数学和统计方法

这里介绍一些关于计算整个数组统计值或关于轴向数据的科学函数,可以作为数组类型的方法被调用。

load failed

注意:像mean、sum等函数可以接收一个可选参数axis,可以用于计算定轴上向上的统计值

array.mean(1)表示计算每一列的平均值,arr.sum(0)表示计算行轴向的累和

cumsumcumprod不会聚合,会产生中间结果,比如:

1
2
3
arr = np.arange(8)
print(arr.cumsum()) ==>
[ 0 1 3 6 10 15 21 28]

布尔值数组的方法

可以用sum函数计算布尔数组中true的个数

1
2
arr = np.random.randn(100)
print((arr>0).sum())

上述程序用于统计随机数中正值的个数

同时还有anyall函数,前者用来检验数组中是否至少还有一个True,而后者用来检验是否每个值都是True。

排序

Numpy数组可以使用sort方法按位置进行排序

可以在多维数组中根据传递的axis值,沿着轴对每个一维数据段进行排序,这里不再举例。

唯一值与其他组合逻辑

Numpy中包含一些针对一维ndarray的基础集合操作。

load failed

Author: YihangBao
Link: https://roarboil.github.io/2019/09/04/arrayobj/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.