NumPy基础:使用数组进行文件输入和输出,线性代数,伪随机数生成,示例:随机漫步

使用数组进行文件输入和输出

numpy 可以在硬盘中将数据以文本或二进制文件的形式进行存入硬盘或有硬盘载入。我们只讨论numpy 的内建二进制格式,pandans 或其他工具用来载入文本或表格型数据。np.save 和 np.load 是高效存取硬盘数据的方法。数组默认情况下是以未压缩的格式进行存储,后缀名是 .npy

arr = np.arange(10)
np.save('some_array',arr)
np.load('some_array.npy')
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

# 使用np.savez 并将数组作为参数传递给该函数,用于在未压缩文件中保存多个数组。
np.savez('array_archive.npz',a=arr,b=arr)  
arch = np.load('array_archive.npz') # 载入 .npz 文件时,得到的时一个字典型的对象,通过该对象可以方便的载入单个数组
print(arch['a'])
[0 1 2 3 4 5 6 7 8 9]

如果你的文件已经压缩好,可以使用 numpy.savez_compressed将数据存入已经压缩的文件

np.savez_compressed('arrays_compressed.npz',a=arr,b=arr)

线性代数。。

线性代数,比如矩阵乘法,分界,行列式等方阵数学,时所有数组类库的重要组成部分。在numpy 中 * 时矩阵的逐元素乘积而不是点乘积。 因此numpy 的数组方法和 numpy命名空间都有一个函数 dot 用来矩阵的操作。

x=np.array([[1,2,3],[4,5,6]])
y=np.array([[7,8],[8,9],[9,0]])
x.dot(y)        # 等价于 np.dot(x,y)
array([[ 50,  26],
       [122,  77]])

# 一个二维数组和一个长度合适的一维数组之间的矩阵乘积是一个一维数组
np.dot(x,np.ones(3))    # 等价于 x @ np.ones(3),,@ 中缀操作符,用于点乘矩阵操作。
array([ 6., 15.])

numpy.linalg 拥有一个矩阵分解的标准函数,以及其他常用函数,比如求逆和行列式求解。

from numpy.linalg import inv,qr
x=np.random.randn(5,5)
mat=x.T.dot(x)   # x 和 他的转置矩阵的乘积
print(inv(mat))              # 计算方阵的逆矩阵

在这里插入图片描述
想念我的线代笔记本,,,,开学吧。。。。。。

伪随机数生成

numpy.random 模块弥补了python内置模块random 的不足,可以高校生成多种概率分布下的完整样本值数据。

samples=np.random.normal(size=(4,4)) # 获得一个 4*4 的正态分布样本
samples
array([[ 0.83116457, -0.87410967, -0.54194594, -0.72018669],
       [ 0.0736726 ,  0.64240471,  0.51880425, -1.93366261],
       [-0.08573196,  0.13970227, -0.03730118, -0.01263474],
       [-1.04690507, -0.72316258, -0.30149603, -0.54328124]])

我们可以称这些为伪随机数,因为他们是由具有确定性行为的算法根据随机数生成器中的随机数种子生成的。你可以通过np.random.seed 更改 numpy 的随机数种子np.random.seed(1234)

numpy.random 中的数据生成函数使用一个全局随机数种子。为了避免全局状态,可以使用 numpy.random.RandomState创建一个随机数生成器,是数据独立与其他的随机数状态。。。疑惑。。。

随机数就是就随机数种子中取出的数。
种子就是个序号,这个序号交给一个数列管理器,通过这个序号,你从管理器中取出一个数列,这个数列就是你通过那个序号得到的随机数。
但这个随机数并不真正随机。因为它是通过某个算法的得到。也就是说你给数列管理器同一个序号将得到同样一个“随机”数列。也就是说种子和随机数列是一一对应的。
{An}=f(x), x 就是种子,f()是算法,{An}是数列,这个数列看上去是随机的,这是因为An的通项很复杂。
例如:从1、2、3、4、5、6、7、8、9、0这十个数中随机取出一个数,取出的数是6的话,那么6就叫随机数。十个数字就叫随机数种子。如果是从1到50之间取数字,取出的数字叫随机数,这1到50那50个数字就叫随机数种子。

在这里插入图片描述

示例:随机漫步

一个简单的随机漫步,步进为1 -1,两种步进发生的概率相同,

扫描二维码关注公众号,回复: 11307525 查看本文章
nsteps = 1000
draws = np.random.randint(0,2,size=nsteps)
steps = np.where(draws>0,1,-1)            
walk=steps.cumsum()
import matplotlib.pyplot as plt
plt.plot(walk)     # 可视化

在这里插入图片描述
可以在漫步轨道上提取一些统计数据walk.min() # 最小值 更复杂的统计是,随机漫步的某一步达到了某个特定的值。这里假设我们想知道漫步是何时连续走了十步。
np.abs(walk) >= 10 给我们一个布尔值数组,用于表示是否在同一方向走了十步。使用 (np.abx(walk) >= 10).argmax()
返回布尔值数组中最大值的第一个位置(True 就是最大值),来获得第一次走到10 或 -10 步的位置。

一次性模拟多次随机漫步

传入一个二元组,生成一个二维的抽取数组,并且我们可以一次性的跨行计算出全部5000次随机漫步的积累和

nwalks = 5000
nsteps=1000
draws=np.random.randint(0,2,size=(nwalks,nsteps))
steps=np.where(draws>0,1,-1)
walks=steps.cumsum(1)

如果我们要计算出30的最小穿越时间,因为不是所有的5000次都会达到30,可以使用any

hits30=(np.abs(walks) >=30).any(1)
hits30.sum()       # 达到穿越时间的个数
3407

crossing_times=(np.abs(walks[hits30])>=30).argmax(1) # 使用布尔数组选出超过30所在的行,再选出轴向1的穿越时间
array([409, 139, 391, ..., 201, 555, 323], dtype=int64)

猜你喜欢

转载自blog.csdn.net/weixin_46192930/article/details/106373677