代码实现请见我的GitHub:Numpy下
01输入输出
numpy二进制文件
- numpy.save(file, arr, allow_pickle=True, fix_imports=True) 将数组arr保存到file文件中,文件格式为.npy二进制文件,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npy 的文件中。以二进制的方式存储文件,在二进制文件第一行以文本形式保存了数据的元信息(ndim,dtype,shape等),可以用二进制工具查看内容。
numpy.savez(file, args, *kwds) 将几个数组保存到文件file中,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npz 的文件中。输出的是一个压缩文件(扩展名为npz),其中每个文件都是一个 save() 保存的npy文件,文件名对应于数组名。 load() 自动识别npz文件,并且返回一个类似于字典的对象,可以通过数组名作为关键字获取数组的内容。可以给数组起名字,默认的话会自动起名为 arr_0, arr_1, …
文本文件
savetxt() , loadtxt() 和 genfromtxt() 函数用来存储和读取文本文件(如TXT,CSV等)。genfromtxt() 比 loadtxt() 更加强大,可对缺失数据进行处理。
np.savetxt(fname, X, fmt=’%.18e’, delimiter=’ ‘, newline=’\n’, header=’’, footer=’’, comments=’# ‘, encoding=None) 将数组保存到文件中
- fname:文件路径
- X:存入文件的数组
- fmt:写入文件中每个元素的字符串格式,默认’%.18e’(保留18位小数的浮点数形式)
- delimiter:分割字符串,默认以空格分隔
- np.loadtxt(fname, dtype=float, comments=’#’, delimiter=None, converters=None,
skiprows=0, usecols=None, unpack=False, ndmin=0, encoding=’bytes’, max_rows=None) 从文本文件中加载数据- fname:文件路径。
- dtype:数据类型,默认为float。
- comments: 字符串或字符串组成的列表,默认为# , 表示注释字符集开始的标志。
- skiprows:跳过多少行,一般跳过第一行表头。
- usecols:元组(元组内数据为列的数值索引), 用来指定要读取数据的列(第一列为0)。
- unpack:当加载多列数据时是否需要将数据列进行解耦赋值给不同的变量。
-
文本格式选项
numpy.set_printoptions(precision=None,threshold=None, edgeitems=None,linewidth=None,
suppress=None, nanstr=None, infstr=None,formatter=None, sign=None, floatmode=None,
**kwarg) 设置打印选项- precision :设置浮点精度,控制输出的小数点个数,默认是8。
- threshold :概略显示,超过该值则以“…”的形式来表示,默认是1000。
- linewidth :用于确定每行多少字符数后插入换行符,默认为75。
- suppress :当 suppress=True ,表示小数不需要以科学计数法的形式输出,默认是False。
- nanstr :浮点非数字的字符串表示形式,默认 nan 。
- infstr :浮点无穷大的字符串表示形式,默认 inf 。
02随机抽样
numpy.random 模块对 Python 内置的 random 进行了补充,增加了一些用于高效生成多种概率分
布的样本值的函数,如正态分布、泊松分布等。
表示对一个二项分布进行采样, size 表示采样的次数也即n次伯努利实验进行的次数, n 表示做了 n 重伯努利试验, p 表示成功的
概率,函数的返回值表示 n 中成功的次数。
泊松分布
泊松分布主要用于估计某个时间段某事件发生的概率
- numpy.random.poisson(lam=1.0, size=None) Draw samples from a Poisson distribution.
表示对一个泊松分布进行采样, size 表示采样的次数, lam 表示一个单位内发生事件的平均值,函
数的返回值表示一个单位内事件发生的次数
超几何分布
假设有限总体包含N个样本,其中质量合格的为m个,则剩余的N-m个为不合格样本,如果从该有限总体中抽取出n个样本,其中有k个是质量合格的概率为:
- numpy.random.hypergeometric(ngood, nbad, nsample, size=None) Draw samples from a
Hypergeometric distribution.
表示对一个超几何分布进行采样, size 表示采样的次数, ngood 表示总体中具有成功标志的元素个数, nbad 表示总体中不具有成功标志的元素个数, ngood+nbad 表示总体样本容量, nsample 表示抽取元素的次数(小于或等于总体样本容量),函数的返回值表示抽取 nsample 个元素中具有成功标识的元素个数。
连续型随机变量
均匀分布
numpy.random.uniform(low=0.0, high=1.0, size=None) Draw samples from a uniform distribution
正态分布
numpy.random.randn(d0, d1, …, dn) Return a sample (or samples) from the “standard normal” distribution.
numpy.random.normal(loc=0.0, scale=1.0, size=None) Draw random samples from a normal (Gaussian) distribution,创建均值为 loc(mu),标准差为 scale(sigma),大小为 size 的数组
指数分布
指数分布描述时间发生的时间长度间隔.
numpy.random.exponential(scale=1.0, size=None) Draw samples from an exponential distribution, scale = 1/lambda
其他随机函数
随机从序列中获取元素
numpy.random.choice(a, size=None, replace=True, p=None) Generates a random sample from a given 1-D array.
从序列中获取元素,若 a 为整数,元素取值从 np.range(a) 中随机获取;若 a 为数组,取值从 a 数组元素中随机获取。该函数还可以控制生成数组中的元素是否重复 replace ,以及选取元素的概率 p 。
对数据集进行洗牌操作
- numpy.random.shuffle(x) 对 x 进行重排序,如果 x 为多维数组,只沿第 0 轴洗牌,改变原来的数组,输出为None
- numpy.random.permutation(x) Randomly permute a sequence, or return a permuted range. permutation() 函数的作用与 shuffle() 函数相同,可以打乱第0轴的数据,但是它不会改变原来的数组。
03统计相关
- np.amin(a[, axis=None, out=None, keepdims=np._NoValue, initial=np._NoValue, where=np._NoValue]) 如果不指定axis的话,就是返回最小值;axis=0,取每列的最小值然后返回;axis=1,取每行的最小值然后返回;
- np.amax(a[, axis=None, out=None, keepdims=np._NoValue, initial=np._NoValue, where=np._NoValue]) 如果不指定axis的话,就是返回最大值;axis=0,取每列的最大值然后返回;axis=1,取每行的最大值然后返回;
- np.ptp(a, axis=None, out=None, keepdims=np._NoValue) 如果不指定axis的话,就是返回极差;axis=0,取每列的极差然后返回;axis=1,取每行的极差然后返回;
- numpy.percentile(a, q, axis=None, out=None, overwrite_input=False,interpolation=’linear’,keepdims=False) 如果不指定axis的话,就是返回百分位q数;axis=0,取每列的百分位q数然后返回;axis=1,取每行的百分位q数然后返回;
注:百分位数是统计中使用的度量,表示小于这个值的观察值占总数q的百分比。
- numpy.median(a, axis=None, out=None, overwrite_input=False, keepdims=False) 如果不指定axis的话,就是返回中位数;axis=0,取每列的中位数然后返回;axis=1,取每行的中位数然后返回;
- numpy.mean(a[, axis=None, dtype=None, out=None, keepdims=np._NoValue)]) 如果不指定axis的话,就是返回平均数;axis=0,取每列的平均数然后返回;axis=1,取每行的平均数然后返回;
- numpy.average(a[, axis=None, weights=None, returned=False]) 如果不指定weights的话,就是计算平均数,否则是计算加权平均数,如果不指定axis的话,就是返回加权平均数;axis=0,取每列的加权平均数然后返回;axis=1,取每行的加权平均数然后返回;
- numpy.var(a[, axis=None, dtype=None, out=None, ddof=0, keepdims=np._NoValue]) 如果不指定axis的话,就是返回方差;axis=0,取每列的方差然后返回;axis=1,取每行的方差然后返回;
ddof=0:是“Delta Degrees of Freedom”,表示自由度的个数 ,关于自由度可以参考:如何理解统计学中「自由度」这个概念?
- numpy.std(a[, axis=None, dtype=None, out=None, ddof=0, keepdims=np._NoValue]) 计算标准差,基本同方差
- numpy.cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None,aweights=None) 计算协方差
- numpy.corrcoef(x, y=None, rowvar=True, bias=np._NoValue, ddof=np._NoValue) 计算相关系数,协方差描述的是两个向量协同变化的程度,它的取值可能非常大,也可能非常小,这就导致没法直观地衡量二者协同变化的程度。相关系数实际上是正则化的协方差, n 个变量的相关系数形成一个 n 维方阵
- numpy.digitize(x, bins, right=False) 返回每个值属于的bins的index
- x:numpy数组
- bins 一维单调数组,必须是升序或者降序
- right:间隔是否包含最右,也就是区间是不是右闭区间的
- 返回值:x在bins中的位置
04 线性代数
矩阵乘积
numpy.dot(a, b[, out]) 计算两个矩阵的乘积,如果是一维数组则是它们的内积 ;
特征值特征向量
a,b= numpy.linalg.eig(a) 计算方阵的特征值和特征向量,a为特征值,b为特征向量;
numpy.linalg.eigvals(a) 计算方阵的特征值;
奇异值分解
u, s, v = numpy.linalg.svd(a, full_matrices=True, compute_uv=True, hermitian=False) 奇异值分解
- a 是一个形如(M,N)矩阵
- full_matrices 的取值是为False或者True,默认值为True,这时 u 的大小为(M,M), v 的大小为(N,N)。否则 u 的大小为(M,K), v 的大小为(K,N) ,K=min(M,N);
- compute_uv 的取值是为False或者True,默认值为True,表示计算 u,s,v 。为False的时候只计算 s ;
- 总共有三个返回值 u,s,v , u 大小为(M,M), s 大小为(M,N), v 大小为(N,N), a = usv ;
- 其中 s 是对矩阵 a 的奇异值分解。 s 除了对角元素不为 0 ,其他元素都为 0 ,并且对角元素从大到小排列。 s 中有 n 个奇异值,一般排在后面的比较接近0,所以仅保留比较大的 r个奇异值。
QR分解
q,r = numpy.linalg.qr(a, mode=’reduced’) 计算矩阵 a 的QR分解。
L = numpy.linalg.cholesky(a) 返回正定矩阵 a 的 Cholesky 分解 a = L*L.T ,其中 L 是下三角。
范数
numpy.linalg.norm(x, ord=None, axis=None, keepdims=False) 计算向量或者矩阵的范数。
-
方阵的行列式
-
矩阵的秩
numpy.linalg.matrix_rank(M, tol=None, hermitian=False) 返回矩阵的秩
矩阵的迹
numpy.trace(a, offset=0, axis1=0, axis2=1, dtype=None, out=None) 方阵的迹就是主对角元素之和。
矩阵的逆
numpy.linalg.inv(a) 计算矩阵 a 的逆矩阵(矩阵可逆的充要条件: det(a) != 0 ,或者 a 满秩)。
求解线性方程组
numpy.linalg.solve(a, b) 求解线性方程组或矩阵方程
05大作业
完成以下任务:
导入鸢尾属植物数据集
- 求出鸢尾属植物萼片长度的平均值、中位数和标准差(第1列,sepallength)
- 创建一种标准化形式的鸢尾属植物萼片长度,其值正好介于0和1之间,这样最小值为0,最大值为1(第1列,sepallength)
- 找到鸢尾属植物萼片长度的第5和第95百分位数(第1列,sepallength)
- 把iris_data数据集中的20个随机位置修改为np.nan值
- 在iris_data的sepallength中查找缺失值的个数和位置(第1列)
- 筛选具有 sepallength(第1列)< 5.0 并且 petallength(第3列)> 1.5 的 iris_data行
- 选择没有任何 nan 值的 iris_data行
- 计算 iris_data 中sepalLength(第1列)和petalLength(第3列)之间的相关系数。
- 找出iris_data是否有任何缺失值
- 在numpy数组中将所有出现的nan替换为0
- 找出鸢尾属植物物种中的唯一值和唯一值出现的数量
- 将 iris_data 的花瓣长度(第3列)以形成分类变量的形式显示。定义:Less than 3 —> ‘small’;3-5 —> ‘medium’;’>=5 —> ‘large’
- 在 iris_data 中创建一个新列,其中 volume 是 (pi x petallength x sepallength ^ 2)/ 3 。
- 随机抽鸢尾属植物的种类,使得Iris-setosa的数量是Iris-versicolor和Iris-virginica数量的两倍
- 根据 sepallength 列对数据集进行排序
- 在鸢尾属植物数据集中找到最常见的花瓣长度值(第3列)
- 在鸢尾花数据集的 petalwidth(第4列)中查找第一次出现的值大于1.0的位置
更多请参考代码:05大作业
