这一天是对NumPy的学习最后一天的学习,之后就暂一告落了。后面还是有更详细的一定会更新在这上面。
NumPy可以在硬盘中将数据以文本或二进制文件的形式进行存入硬盘或由硬盘载入。但我们只讨论NumPy的内建二进制格式,因为大部分用户更倾向于使用pandas或其他工具来载入文本或表格型数据。
np.save 和 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入门。最后祝大家国庆节快乐!!