- NumPy(三)—— 排序/随机变量/统计/线性代数
- 五、排序/随机变量/统计/线性代数等
- 5.1 排序搜索计数
- 5.2 集合操作
- 5.3 输入输出
- 5.3.1 二进制文件
- 5.3.2 文本文件
- 5.4 随机变量(np.random)
- 5.4.1 离散型随机变量
- 5.4.2 连续型随机变量
- 5.4.3 其他随机函数
- 5.5 统计相关
- 5.6 线性代数
- 5.6.1 创建矩阵
- 5.6.2 矩阵函数
- 5.7 线性代数小练习
五、排序/随机变量/统计/线性代数等 5.1 排序搜索计数大家可以关注知乎或微信公众号的share16,我们也会同步更新此文章。
''' sort、argsort '''
import numpy as np
x = np.random.randint(10,20,15)
print(x,np.sort(x),sep='nn')
for i in x.argsort():
print(x[i], end=' ')
# >> [12 15 12 19 15 13 13 11 16 15 12 14 11 12 18]
# >> [11 11 12 12 12 12 13 13 14 15 15 15 16 18 19]
# >> 11 11 12 12 12 12 13 13 14 15 15 15 16 18 19
''' 最大/小值索引 '''
import numpy as np
a = np.array([10, 9, 20, 0, 17, np.nan])
print('最大值(argmax,含NaN):{}n最大值(nanargmax,不含NaN):{}n'.format(a.argmax(),np.nanargmax(a)))
print('最小值(argmin,含NaN):{}n最小值(nanargmin,不含NaN):{}n'.format(a.argmin(),np.nanargmin(a)))
# >> 最大值(argmax,含NaN):5
# >> 最大值(nanargmax,不含NaN):2
# >> 最小值(argmin,含NaN):5
# >> 最小值(nanargmin,不含NaN):3
5.2 集合操作
save()、savez() 和 load() 函数以 numpy 专用的二进制类型(.npy、.npz)保存和读取数据,这三个函数会自动处理ndim、dtype、shape等信息,使用它们读写数组非常方便,但save()和savez()输出的文件很难与其它语言编写的程序兼容。
5.3.2 文本文件 savetxt()、loadtxt() 和 genfromtxt() 函数用来存储和读取文本文件(如.TXT、.CSV等)。genfromtxt() 比 loadtxt() 更加强大,可对缺失数据进行处理。
''' 二进制文件,save、savez、load '''
import numpy as np
a = np.random.randint(21,29,15)
b = np.random.randint(26,33,15)
print(a,b)
np.save('test1',a) # 将1个数组保存成'test1'
np.savez('test0',a,b) # 将2个数组保存成'test0'
t1 = np.load('test1.npy') # 读取 npy
t0 = np.load('test0.npz') # 读取 npz
print(t1)
t0.files # 查看各个数组名称
print(t0['arr_0'],t0['arr_1'])
''' 文本文件,savetxt、loadtxt、genfromtxt '''
np.savetxt('test1',a) # 将1个数组保存成test1文本文件
np.savetxt('test0',(a,b)) # 将2个数组保存成test0文本文件
t1 = np.loadtxt('test1') # 读取文本文件
t0 = np.loadtxt('test0') # 读取文本文件
print(t1,'n',t0)
np.genfromtxt('test0')
5.4 随机变量(np.random)
numpy.random 模块对Python内置的random进行了补充,增加了一些用于高效生成多种概率分布的样本值的函数,如正态分布、泊松分布等。
np.random.seed(seed=None)
seed() 确定随机数生成器的种子
如果使用相同的seed()值,则每次生成的随机数都相同;如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同;
在对数据进行预处理时,经常加入新的操作或改变处理策略,此时如果伴随着随机操作,最好还是指定唯一的随机种子,避免由于随机的差异对结果产生影响。
import numpy as np np.random.seed(20) a = np.random.randint(11,20,6) b = np.random.randint(11,20,6) np.random.seed(20) c = np.random.randint(11,20,6) np.random.seed(20) d = np.random.randint(11,20,6) print(a,b) print(c,d) # >> [14 15 17 18 13 11] [17 19 16 14 11 17] # >> [14 15 17 18 13 11] [14 15 17 18 13 11]
5.4.1 离散型随机变量
定义
设X是一个随机变量,若它所有可能的取值只有有限个或可数无穷个,则称X为一个离散型随机变量。
设离散型随机变量X的所有可能取值为Xi(i=1,2,···),称 P(X = Xi) = Pi(i=1,2,···) 为X的概率函数/概率分布。
常见的离散型随机变量的分布
0-1分布、二项分布、泊松分布、超几何分布等;
import numpy as np ''' 二项分布: 一次抛5枚硬币,每硬币正面朝上概率为0.5,做10次试验,求每次试验发生正面朝上的硬币个数''' a = np.random.binomial(5, 0.5, 10) print(a) ''' 泊松分布 ''' b = np.random.poisson(7,10) print(b) ''' 超几何分布: 一共20只动物里有7只是狗,抽取12只里面狗的数量(无放回抽样) ''' c = np.random.hypergeometric(7, 13, 12, size=10) print(c) # >> [2 3 4 1 3 2 3 2 2 2] # >> [3 6 4 7 3 4 5 8 7 8] # >> [5 3 4 5 5 3 4 3 3 4]5.4.2 连续型随机变量
定义
连续型随机变量是指如果随机变量X的所有可能取值不可以逐个列举出来,而是取数轴上某一区间内的任一点的随机变量。
常见的连续型随机变量的分布
均匀分布、指数分布、正态分布等;
import numpy as np ''' 均匀分布: 在low到high范围内,创建大小为size的均匀分布的随机数''' a = np.random.uniform(1, 10, 3) print(a) ''' 指数分布 ''' b = np.random.exponential(1, 3) print(b) ''' 正态分布 ''' c = np.random.normal(2, 2, 3) print(c) # >> [4.55567331 4.73945202 2.80455276] # >> [1.19284369 0.97085477 1.01743578] # >> [-0.65318006 1.36894511 2.23444435]5.4.3 其他随机函数
常见的函数有:最大值(amax)、最小值(amin)、极差(ptp,即最大值-最小值)、分位数(percentile)、中位数(median)、(算术)平均值(mean)、加权平均值(average)、方差(var)、标准差(std)、协方差(cov)、相关系数(corrcoef)等函数,详见NumPy(二)—— 切片索引、数组操作、函数的‘4.3数学函数’版块。
''' 直方图:返回数组中每个元素在bins中的索引
np.digitize(a, bins, right=False) '''
import numpy as np
a = np.array([10,6,11,15,16])
bins = [1,6,11,16,21]
b = np.digitize(a,bins)
print('数组中每个元素在bins中的索引:', b )
for i in range(a.size):
print('{} <= {} < {}'.format(bins[b[i]-1],a[i],bins[b[i]]))
# >> 数组中每个元素在bins中的索引: [2 2 3 3 4]
# >> 6 <= 10 < 11
# >> 6 <= 6 < 11
# >> 11 <= 11 < 16
# >> 11 <= 15 < 16
# >> 16 <= 16 < 21
5.6 线性代数 5.6.1 创建矩阵
详见下图,此外还有些特殊的矩阵,如下:
创建零矩阵(zeros)、单位矩阵(identity、eye)等等,详见NumPy(一)—— 数据类型、创建数组的‘1.5 创建数组’版块。
数组中的函数在矩阵中基本可以应用,此外还有秩(matrix_rank)、迹(trace)、行列式(det)、逆矩阵(inv)、矩阵分解、特征值、特征向量等,详见下图:
数组间的乘法,图解:
从上图,我们基本可以理解dot、vdot、inner、matmul、multiply之间的区别。
计算两个数组a和数组b之间的欧氏距离
import numpy as np a = np.array([1,2,3,4,5]) b = np.array([4,5,6,7,8]) # 方法一 d1 = np.sqrt(np.sum((a-b)**2)) print(d1) # 方法二 d2 = np.linalg.norm(a-b) print(d2) # >> 6.708203932499369 # >> 6.708203932499369
谢谢大家



