默默无名的西大研究生学习的第五天——NumPy基础5


前言

这一天是对NumPy的学习最后一天的学习,之后就暂一告落了。后面还是有更详细的一定会更新在这上面。


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

NumPy可以在硬盘中将数据以文本或二进制文件的形式进行存入硬盘或由硬盘载入。但我们只讨论NumPy的内建二进制格式,因为大部分用户更倾向于使用pandas或其他工具来载入文本或表格型数据。

np.save 和 np.load 是高效存取硬盘数据的两大工具函数。

  1. np.save是可以建立一个.npy为后缀的文件名,把数组保存到文件内。
  2. 如果文件存放路径没写.npy,后缀名会被自动加上。
    而np.load可以载入硬盘上的数组,不过得需要一个变量去接住。
arr = np.arange(10)
np.save('aa.txt.txt', arr)
arr1 = np.load('aa.txt.txt.npy')
print(arr1)
------------------------------------------------------------
[0 1 2 3 4 5 6 7 8 9]

可以使用np.savez将数组作为参数传递给该函数,用于在未压缩文件中保存多个数组:

arr = np.arange(10)
np.savez('geats.npz', a=arr,b=arr)
arr1 = np.load('geats.npz')
print(dict(arr1))
------------------------------------------------------------

{'a': array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), 'b': array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])}

a,b关键字参数作为字典的key,数组作为字典的value。载入一个.npz文件的时候,会获得一个字典型的对象,并通过该对象很方便地载入单个数组。只需要 arr1[key] = value。

如果你的数据已经压缩好了,你可能会想要使用numpy.savez_compressed将数据存入已经压缩的文件。

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

五、线性代数

线性代数,比如矩阵乘法、分解、行列式等方阵数学,是所有数组类库的重要组成部分。numpy.linalg拥有一个矩阵分解的标准函数集,以及其他常用函数,例如求逆和行列式求解。下表是最常用的线性代数函数列表。

函数描述
diag将一个方阵的对角(或非对角)元素作为一维数组返回,或者将一维数组转换成一个方阵,并且在非对角线上有零点
dot矩阵点乘
trace计算对角元素和
det计算矩阵行列式
eig计算方阵的特征值和特征向量
inv计算方阵的逆矩阵
pinv计算矩阵的Moore-Penrose伪逆
qr计算QR分解
svd计算奇异值分解(SVD)
solve求解x的线性系统Ax=b,其中A是方阵
lstsq计算Ax=b的最小二乘解

其中在NumPy中的线性代数,*表示的是矩阵逐元素乘积,而矩阵点乘则是用dot。

x = np.array([[1., 2., 3.], [4., 5., 6.]])
y = np.array([[6., 23.], [-1, 7], [8, 9]])
print(x)
print(y)
arr = x.dot(y)
print(arr)

arr1 = np.dot(x,y)
print(arr1)
------------------------------------------------------------
[[1. 2. 3.]
 [4. 5. 6.]]
 
[[ 6. 23.]
 [-1.  7.]
 [ 8.  9.]]
 
[[ 28.  64.]
 [ 67. 181.]]
 
[[ 28.  64.]
 [ 67. 181.]]

由此可见x.dot(y)等价于np.dot(x,y),但是要注意x和y的位置,相反会产生不同的结果。

其中,特殊符号@也作为中缀操作符,用于点乘矩阵操作:

x = np.array([[1., 2., 3.], [4., 5., 6.]])
print(x)
arr = x @ np.ones(3)
print(np.ones(3))
print(arr)
------------------------------------------------------------
[[1. 2. 3.]
 [4. 5. 6.]]
 
[1. 1. 1.]

[ 6. 15.]

六、伪随机数生成

numpy.random模块填补了Python内建的random模块的不足,可以高效地生成多种概率分布下的完整样本值数组。例如你可以使用normal来获得来获得一个4x4的正态分布样本数组:

samples = np.random.normal(size=(4,4))
print(samples)
------------------------------------------------------------
[[-0.24251837 -1.30763376 -0.06924699 -0.15952659]
 [ 1.87467572  1.85498239  1.05760707  0.59078254]
 [ 0.27034999 -0.85195719  0.53095393  0.28159689]
 [ 0.83414998  0.16133834  0.53201074 -1.71009585]]

我们可以称这些为伪随机数,因为它们是由具有确定性行为的算法根据随机数生成器中的随机数种子生成的。numpy.random中的数据生成函数使用一个全局随机数种子。下表则是numpy.random中的部分函数列表。

函数描述
seed向随机数生成器传递随机状态种子
permutation返回一个序列的随机排列,或者返回一个乱序的整数范围序列
shuffle随机排列一个序列
rand从均匀分布中抽取样本
randint根据给定的由低到高的范围抽取随机整数
randn从均值0方差1的正态分布中抽取样本
binmial从二项分布中抽取样本
normal从正态(高斯)分布中抽取样本
beta从beta分布中抽取样本
chisquare从卡方分布中抽取样本
gamma从伽马分布中抽取样本
uniform从均匀[0,1)分布中抽取样本

有关于seed()函数的介绍可以参考下面的文章:
最细!numpy.random.seed() 函数的解释


小结

先放国庆假啦,国庆假期回来就立马开更pandas入门。最后祝大家国庆节快乐!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值