numpy学习笔记4:数学统计方法、布尔数组、排序、集合方法。

数学和统计方法

平均值、和

1
2
import numpy as np
arr = np.random.randn(5, 4)
1
arr
array([[-0.74501213,  0.08417854, -1.75874197,  1.02433555],
       [ 0.69482999, -0.77008213, -0.60746266,  0.15098635],
       [-0.19760563, -0.00750139,  1.61108572, -0.74922113],
       [-1.10606169,  0.83800608, -0.50852532, -1.50990056],
       [-1.55019076, -2.07183149, -0.30625562, -0.23447214]])
1
arr.mean()  #平均值
-0.38597211999176573
1
np.mean(arr) #也可以用numpy全局函数
-0.38597211999176573
1
arr.sum()  #所有元素的和
-7.7194423998353141
1
arr.mean(axis=1)  #按轴1(即按列)计算平均值,各列相加再除以列数求平均数,得数的个数为行数
array([-0.34881   , -0.13293211,  0.16418939, -0.57162037, -1.0406875 ])
1
arr.sum(axis=0) #按轴0(即按行)计算平均值,各行相加再除以行数求平均数,得数的个数为列数
array([-2.90404022, -1.92723039, -1.56989985, -1.31827194])

累加和与积函数

1
arr = np.array([0, 1, 2, 3, 4, 5, 6, 7])
1
arr.cumsum()  #累加和
array([ 0,  1,  3,  6, 10, 15, 21, 28], dtype=int32)
1
arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
1
arr
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
1
arr.cumsum(axis=0) #按轴0,即按行累加
1
arr.cumprod(axis=1) #按轴1,即按列累乘
array([[  0,   0,   0],
       [  3,  12,  60],
       [  6,  42, 336]], dtype=int32)

基本数组统计方法

方法 描述
sum 数组元素和,可选参数:轴
mean 算数平均值
std, var 标准差
min, max 最小和最大值
argmin, argmax 最小和最大元素所在的位置索引
cumsum 累加和
cumprod 累加积

布尔数组有关方法

上面的方法中,对于布尔值的数组,布尔值与1(True)和0(False)等价。

1
2
arr = np.random.randn(100)
(arr > 0).sum() #这样可计算数组中大于0的元素的个数
42
1
2
bools = np.array([False, False, True, False])
bools.any() #数组中任一元素为True,则any()返回值为True
True
1
bools.all() #数组中所有元素为True,all()方法才能返回True,否则为False
False

排序

sort方法原地修改源数组,但全局函数np.sort()创建一个排序后的数组拷贝,而不是改变原数组。

1
2
arr = np.random.randn(6)
arr
array([ 2.12344061,  0.1013188 ,  0.41783073,  3.31179217,  1.15477831,
        2.17607684])
1
2
arr.sort()
arr
array([ 0.1013188 ,  0.41783073,  1.15477831,  2.12344061,  2.17607684,
        3.31179217])

下面一个例子,数组可按轴排序。

1
2
arr = np.random.randn(5, 3)
arr
array([[-0.79889695,  1.02591275,  0.16768367],
       [-0.15944299, -0.22921454, -0.37237582],
       [-1.58865821, -0.93659296,  0.72416659],
       [-0.48231842, -0.95794791, -0.69966767],
       [ 1.4034206 ,  1.3355452 , -0.19016655]])
1
2
arr.sort(1) #列排序 
arr
array([[-0.79889695,  0.16768367,  1.02591275],
       [-0.37237582, -0.22921454, -0.15944299],
       [-1.58865821, -0.93659296,  0.72416659],
       [-0.95794791, -0.69966767, -0.48231842],
       [-0.19016655,  1.3355452 ,  1.4034206 ]])

下面一个例子说明,可以以排序方法来快速计算一个数列的分位数。

1
2
3
large_arr = np.random.randn(1000)
large_arr.sort()
large_arr[int(0.05 * len(large_arr))] # 5%分位数
-1.6172219056866222

唯一及其他集合方法

1
2
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
np.unique(names) #去掉重复元素,并排序
array(['Bob', 'Joe', 'Will'],
      dtype='<U4')
1
2
ints = np.array([3, 3, 3, 2, 2, 1, 1, 4, 4])
np.unique(ints) #去掉重复元素,并排序
array([1, 2, 3, 4])
1
sorted(set(names))  #对比一下,这是python的原生替代方法
['Bob', 'Joe', 'Will']
1
2
values = np.array([6, 0, 0, 3, 2, 5, 6])
np.in1d(values, [2, 3, 6]) #判断values中的元素是否在[2, 3, 6]中,生成一个与values数组相对应的Bool数组
array([ True, False, False,  True,  True, False,  True], dtype=bool)

集合类函数简表

方法 描述
unique(x) 计算数组x中的不重复元素,并排序
intersect1d(x, y) 数组x和y的交集
union1d(x, y) 并集
in1d(x, y) 计算数组x中的元素是否在数组y中,产生一个与x对应的Bool数组
setdiff1d(x, y) 集合x与y的差集
setxor1d(x, y) 集合X和Y的异或并集,即两者并集减去交集