numpy数组操作
import numpy as npa = np.array([ [1,2,3,4], [5,6,7,8], [9,10,11,12]])a.shape(3, 4)
a.shape=4,3aarray([[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9], [10, 11, 12]])
a.shape=3,-1 # -1表示自动推断aarray([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]])
生成序列
# 终点不在数组中print(np.arange(0, 1, 0.1))# 将区间等分,终点在数组中print(np.linspace(0, 1, 10))# 终点不在数组中print(np.linspace(0, 1, 10, endpoint=False))# 指数的线性划分,默认10为底,终点在数组中print(np.logspace(0, 3, 4))print(np.logspace(0, 3, 4, base=2))[ 0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9][ 0. 0.11111111 0.22222222 0.33333333 0.44444444 0.55555556 0.66666667 0.77777778 0.88888889 1. ][ 0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9][ 1. 10. 100. 1000.][ 1. 2. 4. 8.]print( np.fromfunction(lambda x, y: x + y, [4, 3]))[[ 0. 1. 2.] [ 1. 2. 3.] [ 2. 3. 4.] [ 3. 4. 5.]]
反转列表
s = '1234'print(s[::-1])r = slice(None, None, -1)print(s[r])
运行时间比较,np的数字类型比Python的原生类型慢
a=3.14b=np.float64(3.14 )%timeit a*a%timeit b*b51.7 ns ± 0.579 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)185 ns ± 1.62 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
极大似然估计
import numpy as npimport pylab as pl# 正态分布概率密度计算def normal_pdf(mean, var, x): return 1 / np.sqrt(2 * np.pi * var) * np.exp(-(x - mean) ** 2 / (2 * var))# 设置随机种子np.random.seed(42)# 产生十个正太样本data = np.random.normal(0, 2.0, 10)# 计算均值和方差mean, var = np.mean(data), np.var(data)print(mean, var)# 在var附近找100个点,var_range = np.linspace(max(var - 4, 0.1), var + 4.0, 100)# 计算这些点的概率密度,由于使用了广播# p是一个二维数组,第0轴对应var_range的各个方差,第一轴对应data的每个元素p = normal_pdf(mean, var_range[:, None], data)print(p)# 极大似然函数的值# 沿着p的第1轴求所有概率的乘积p = np.product(p, axis=1)print(p)# 画出极大似然函数pl.plot(var_range, p)# 画出平行于y轴的竖线pl.axvline(var, 0, 1, c='r')pl.show()
where 的使用
x = 10x = 1 if x > 3 else 0x = np.arange(0, 10, 1)print(np.where(x > 3, 1, 0)) # [0 0 0 0 1 1 1 1 1 1]
求和函数,轴的使用,axis表示沿着哪一个轴移动
x = np.array( [ [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], ])print(x)print(np.sum(x, axis=0))print(np.sum(x, axis=1))print(np.sum(x))[[1 2 3 4] [1 2 3 4] [1 2 3 4] [1 2 3 4] [1 2 3 4]][ 5 10 15 20][10 10 10 10 10]50
数组转化
a = np.array([ 1, 2, 3])print(a) # 一维数组print(a[:, None]) # 二位列向量 print(a[None, :]) # 二维行向量[1 2 3][[1] [2] [3]][[1 2 3]]