代码实现请见我的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:当加载多列数据时是否需要将数据列进行解耦赋值给不同的变量。
  • genfromtxt() 是面向结构数组和缺失数据处理的

    文本格式选项

  • 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 进行了补充,增加了一些用于高效生成多种概率分
布的样本值的函数,如正态分布、泊松分布等。

  • numpy.random.seed(seed=None)

    离散型随机变量

    二项分布

    第十九期组队学习--Numpy下 - 图1

  • numpy.random.binomial(n, p, size=None) Draw samples from a binomial distribution.

表示对一个二项分布进行采样, size 表示采样的次数也即n次伯努利实验进行的次数, n 表示做了 n 重伯努利试验, p 表示成功的
概率,函数的返回值表示 n 中成功的次数。

泊松分布

泊松分布主要用于估计某个时间段某事件发生的概率
第十九期组队学习--Numpy下 - 图2

  • numpy.random.poisson(lam=1.0, size=None) Draw samples from a Poisson distribution.

表示对一个泊松分布进行采样, size 表示采样的次数, lam 表示一个单位内发生事件的平均值,函
数的返回值表示一个单位内事件发生的次数

超几何分布

假设有限总体包含N个样本,其中质量合格的为m个,则剩余的N-m个为不合格样本,如果从该有限总体中抽取出n个样本,其中有k个是质量合格的概率为:
第十九期组队学习--Numpy下 - 图3

  • 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下 - 图4

  • 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下 - 图5
第十九期组队学习--Numpy下 - 图6

  • numpy.corrcoef(x, y=None, rowvar=True, bias=np._NoValue, ddof=np._NoValue) 计算相关系数,协方差描述的是两个向量协同变化的程度,它的取值可能非常大,也可能非常小,这就导致没法直观地衡量二者协同变化的程度。相关系数实际上是正则化的协方差, n 个变量的相关系数形成一个 n 维方阵

第十九期组队学习--Numpy下 - 图7

  • 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分解。

    • a 是一个(M, N)的待分解矩阵
    • mode = reduced :返回(M, N)的列向量两两正交的矩阵 q ,和(N, N)的三角阵r (Reduced QR分解)。
    • mode = complete :返回(M, M)的正交矩阵 q ,和(M, N)的三角阵 r (Full QR分解)。

      Cholesky分解

  • L = numpy.linalg.cholesky(a) 返回正定矩阵 a 的 Cholesky 分解 a = L*L.T ,其中 L 是下三角。

    范数

  • numpy.linalg.norm(x, ord=None, axis=None, keepdims=False) 计算向量或者矩阵的范数。

  • image.png

    方阵的行列式

  • numpy.linalg.det(a) 计算行列式

    矩阵的秩

  • 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大作业

参考