要知道的数学名词
线性代数 行列式 行列式的计算 矩阵的乘法
矩阵的转置 矩阵的逆 矩阵*矩阵的逆=单位阵 矩阵QR分解
随机漫步
随机生成1或者-1,每次生成进行叠加,存入数组,查看关系
# -*- coding: utf-8 -*-
import numpy as np
'''
将数组以二进制方式存入磁盘
'''
arr=np.arange(10)
print(arr)#[0 1 2 3 4 5 6 7 8 9]
#npy结尾的文件
np.save('some_array',arr)
#读取文件
read_arr=np.load('some_array.npy')
print(read_arr)#[0 1 2 3 4 5 6 7 8 9]
#保存到压缩格式,npz结尾的文件
np.savez('zip_arr',a=arr,b=arr)
#加载npz的文件
arch=np.load('zip_arr.npz')
print(arch['b'])#[0 1 2 3 4 5 6 7 8 9]
#加载cvs格式的txt文件
arr=np.loadtxt('a.txt',delimiter=',')
print(arr)
# [[ 1. 23. 4. 532. 52. 23.]
# [ 1. 123. 321. 3. 1. 3.]
# [123. 32. 32. 1. 23. 1.]]
#存入文件
np.savetxt('b.txt',arr)
'''
线性代数
行列式
行列式的计算
矩阵的乘法
矩阵的转置
矩阵的逆
矩阵*矩阵的逆=单位阵
矩阵QR分解
随机漫步
'''
x=np.array([[1,2,3,],[4,5,6]])
y=np.array([[6,23],[-1,7],[8,9]])
print(x)
print(y)
# [[1 2 3]
# [4 5 6]]
# [[ 6 23]
# [-1 7]
# [ 8 9]]
# xy
#矩阵的乘法,y的行数要等x的列数
print(x.dot(y))
#[[ 28 64]
# [ 67 181]]
#如果yx,
# 就是x的行数要等与y的列数
print(y.dot(x))
# [[ 98 127 156]
# [ 27 33 39]
# [ 44 61 78]]
z=np.array([[1,2],[3,4]])
print(z)
# [[1 2]
# [3 4]]
#print(z.dot(y))#ValueError: shapes (2,2) and (3,2) not aligned: 2 (dim 1) != 3 (dim 0)
print(y.dot(z))#y的列数=z的行数 生成的类型y的行数z的列数的矩阵
# [[ 75 104]
# [ 20 26]
# [ 35 52]]
w=np.ones(3)
print(w)
# w
# [1. 1. 1.]
#x
# [[1 2 3]
# [4 5 6]]
print(x.dot(w))#[ 6. 15.]
from numpy.linalg import inv,qr,det
X=np.random.randn(5,5)
print(X)
#X的转置 * X矩阵的本身
mat=X.T.dot(X)
print(mat)
#再去矩阵的逆
mat_=inv(mat)
#在将矩阵 * 矩阵的逆=单位阵
print(mat.dot(inv(mat)))
# [[ 1.00000000e+00 -1.38777878e-17 9.71445147e-17 1.11022302e-16
# -4.16333634e-17]
# [-1.11022302e-16 1.00000000e+00 -4.44089210e-16 0.00000000e+00
# 0.00000000e+00]
# [ 0.00000000e+00 1.11022302e-16 1.00000000e+00 0.00000000e+00
# -3.33066907e-16]
# [-2.42861287e-17 8.15320034e-17 -1.40512602e-16 1.00000000e+00
# 6.59194921e-17]
# [ 5.55111512e-17 0.00000000e+00 0.00000000e+00 -1.66533454e-16
# 1.00000000e+00]]
x_=inv(X)
a=X.dot(x_)
print(a)
'''
qr分解
'''
print(mat)
# [[ 5.94700575 1.67794721 5.05492158 -2.95012009 -6.74457499]
# [ 1.67794721 5.98947553 2.05150894 -0.09196568 -1.65633165]
# [ 5.05492158 2.05150894 7.10432233 -3.14996849 -5.51766286]
# [-2.95012009 -0.09196568 -3.14996849 2.06381474 2.80042822]
# [-6.74457499 -1.65633165 -5.51766286 2.80042822 11.17434671]]
q,r=qr(mat)
print(q)
# [[-0.54763541 0.07785414 0.29677708 0.43010504 0.64881987]
# [-0.15451529 -0.97188837 0.0945459 0.09265504 -0.1184658 ]
# [-0.46548703 -0.04648143 -0.8442281 -0.2185828 0.14374207]
# [ 0.27166448 -0.17202467 0.14554887 -0.68493222 0.63740827]
# [ 0.62108029 -0.13273556 -0.41119203 0.53806515 0.37154751]]
print(r)
# [[-10.85942525 -3.85301838 -10.67485961 5.39602571 14.21884047]
# [ 0. -5.55014905 -0.65624782 -0.72062709 -0.62383063]
# [ 0. 0. -2.49317729 0.92394106 -1.68727171]
# [ 0. 0. 0. -0.49561403 2.24614612]
# [ 0. 0. 0. 0. 0.96390096]]
#以矩阵的形式,返回对角线矩阵
import matlab as mb
a=np.array([[1,0,0],[0,1,0],[0,0,1]])
print(a)
a=mb.diag(a)
print(a)
# [1 1 1]
'''
计算矩阵的行列式
'''
a=det(mat)
print(a)#1.2810727850030796
'''
随机数的生成
'''
#生成有一个标准的正态分布的4*4的样本
sample=np.random.normal(size=(4,4))
print(sample)
# [[-0.46801467 1.14814752 -0.06250482 -0.81041506]
# [ 0.7279229 -0.73639369 0.252881 -0.25403524]
# [ 0.80712111 1.51751028 -1.02781585 -1.75518633]
# [-0.45332071 0.0496177 -0.86698178 0.64285792]]
from random import normalvariate
samples=[normalvariate(0,1) for _ in range(100)]
#print(samples)
'''
随机漫步
模拟随机漫步,说明如何运用数组运算
'''
import random
position=0
walk=[position]
steps=1000
for i in range(steps):
step=1 if random.randint(0,1) else -1#随机生成0是step=1,生成1时step=-1
position+=step
walk.append(position)
#print(walk)
#另一种方式
nsteps=1000
draws=np.random.randint(0,2,size=nsteps)#随机产生0或者1,生成数组
steps=np.where(draws>0,1,-1)#遍历draws大于0的为1,等于零的为-1
walk=steps.cumsum()#数组累加
print(walk)
#计算最大值
print(walk.max())
#计算最小值
print(walk.min())
'''
首次穿越时间--随机漫步,过程中第一次到达某一特定值得时间
'''
#到达10或者时所用的时间
#返回一个布尔类型的数组
bulr=np.abs(walk)>10
#print(bulr)
#找到第一个出现True的索引
index=(np.abs(walk)>=10).argmax()
print(index)
arr=np.array([[1,2,3,4,5],[1,2,3,4,5]])
arr=arr.cumsum(1)
print(arr)
# [[ 1 3 6 10 15]
# [ 1 3 6 10 15]]
'''
模拟多个随机漫步
'''
nwalks=5000
nsteps=1000
draws=np.random.randint(0,2,size=(nwalks,nsteps))#生成二维数组,大数组内包含五千小数组,每个小数组中有一千个数
steps=np.where(draws>0,1,-1)
walks=steps.cumsum(1)#二维数组的叠加
print(walks)
#计算五千个数组中,随机漫步的最大值
print(walks.max())
#最小值
print(walks.min())
'''
难点,五千个过程中计算到30或者-30的最小时间
'''
#先判断这五千个过程中那些数组穿越的30 这里用到了any(),上一篇讲过
boo_list=(np.abs(walks)>30).any(1)#生成了由五千个元素组成的一维数组boolean类型
print(boo_list.sum())#为True的数量总和(大于30的)#3228
#然后我们从五千个过程中选出大于30的过程
boo_test=np.array([True,False])
boo_test2=np.array([[1,2,3],[4,5,6]])
a=boo_test2[boo_test]#选出为True对应的数组
print(a)#[[1 2 3]]
#获取存在三十的过程
one=walks[boo_list]
#获取大于三十的过程
two=np.abs(one)>30
#我们获取大于30的过程的第一个出现30或者-30的索引,集合
three=two.argmax(1)
print(three)#[634 406 450 ... 782 476 584]
#求算数平均数mean
fore=three.mean()
print(fore)#507.4455626715462
从随机漫步中可以看出python真的是一个强大的语言
矩阵乘法上图
每天进步一点点~