numpy数组操作
import numpy as np
a = np.array([
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
])
a.shape
(3, 4)
a.shape=4,3
a
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
a.shape=3,-1 # -1表示自动推断
a
array([[ 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.14
b=np.float64(3.14 )
%timeit a*a
%timeit b*b
51.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 np
import 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()
在