numpy库
开源的科学计算基础库 本篇文章参考中国大学MOOC嵩天老师的课程:python数据分析与展示
数据维度的python表示
一维数组
二维数据
多维数据
高维数据
数组对象ndarray
数据对象特点
- 数组对象可以去掉元素间运算所需的循环,使一维向量更像单个数据
- 设置专门的数组对象,可以提升这类应用的运算速度
- 数组采用相同的数据类型,有利于节省运算和储存空间
关于ndarray
- ndarray是一个多维数组对象,由两部分构成
(1)实际的数据 (2)描述这些数据的元数据(数据维度、数据类型等等) - ndarray数组要求所有数据类型相同,数据下标从0开始
- 在程序中,ndarray的别名是array
- np.array()将数组输出为[ ]形式,元素之间由空格分开
轴(axis)用于保存数据的维度 秩(rank)轴的数量
ndarray对象的属性
属性 | 描述 |
---|
.ndim | 秩 | .shape | 对象的形状,对应矩阵的n行m列 | .size | 对象元素的个数 | .dtype | 对象中元素类型 | .itemsize | 对象中每个元素的大小,以字节为单位 |
ndarray对象的意义
- 去掉元素间运算所需的循环,使得一维向量更像单个数据
- 数组对象采用相同的数据类型,有助于节省运算和存储空间
数组创建与变换
创建方法
- 利用列表、元组等类型创建ndarray
- 使用numpy中的函数创建
函数 | 描述 |
---|
numpy.arange(n) | 返回ndarray类型,元素从0到1 | ones(shape) | 生成一个全1的数组, | zeros(shape) | 生成一个全0的数组 | full(shape,val) | 根据shape生成一个数组,每个元素都是val | eye(n) | 生成一个正方n*n的单位矩阵,对角线为1,其余为0 | ones_like(a) | 根据a的形状生成一个全1的数组 | zeros_like(a) | 根据a的形状生成一个全0的数组 | full_like(a,val) | 根据a的形状生成一个每个元素都是val的数组 |
- 其他方法创建
函数 | 描述 |
---|
linspace() | 根据起止数据等间距填充数据形成数组 | concatenate() | 将两个或多个数组合并成一个新的数组 |
数组变换
对于创建后的数组进行维度变换或元素类型变换 维度变换
方法 | 描述 |
---|
reshape(shape) | 不改变数组元素,返回一个shape形状的数组,不改变原数组 | resize(shape) | 与reshape功能相同,改变原数组 | swapaxes(ax1,ax2) | 将数组两个维度调换 | flatten() | 对数组降维,返回折叠后的一维数组,原数组不变 |
下面我们来看看这些方法的作用
类型转换
函数 | 描述 |
---|
.astype(newtype) | 创建新的数组,数据相同,类型也可能相同 | .tolist() | 数组向列表转换 |
从下面的例子中我们可以看出,转换数组元素的类型时并未改变原数组,此外,如果参数newtype使用numpy中的数据类型时未知名精度,程序会提出警告 下面我们生成一个列表
数组操作
索引和切片 一维数组索引 多维数组索引
多维数组切片
数组运算
数组与标量之间的运算
数组中的每一个元素参与运算
一元函数 对数组中的数据执行元素级运算
函数 | 描述 |
---|
np.abs(x) /np.fabs(x) | 求数组x各元素的绝对值 | np.sprt(x) | 求数组x中各元素平方根 | np.square(x) | 各元素平方 | np.logn(x)(n为底数) | 求各元素对数值 | np.ceil(x) | 求各元素ceiling值 | np.rint(x) | 各元素四舍五入的值 | np.modf(x) | 将各元素小数部分和整数部分分为两个独立的数组返回 | np.sin()/cos()… | 各元素的三角函数值 | np.exp(x) | 各元素指数值 | np.sign(x) | 各元素符号值,-1(-),0,1(+) |
二元函数 两个数组之间的元素运算
函数描述 | |
---|
+、-、*、/、** | 两个数组各元素对应进行运算 | np.copysign(x,y) | 将y中各元素符号赋值给数组x对应的元素 | <、>、<=、>=、!=、== | 算术比较,产生布尔类型 | np.mod(x,y) | 元素级模运算 |
numpy数据存取
csv文件存储
语法格式:np.savetxt(frame,array,format,delimiter)
参数 | 描述 |
---|
frame | 文件(可以是压缩文件),字符串或产生器 | array | 存入文件的数组 | format | 写入文件的格式,如%d,%f | delimiter | 分割字符串,默认空格 |
案例1:使用下面代码生成一个csv文件
打开文件我们可以看到里面的数据
csv文件读取
语法格式:np.loadtxt(frame,dtype,delimiter,unpack)
参数 | 描述 |
---|
frame | 文件(可以为压缩文件),字符串或产生器 | dtype | 数据类型 | delimiter | 分割字符串 | unpack | 为True时,读入变量被写入不同属性 |
案例2:使用loadtxt()函数读取一个csv文件
多维数据存取
多维数据存储 语法格式:array.tofile(frame,sep,format)
参数名 | 描述 |
---|
frame | 文件,字符串 | seq | 分割字符串 | format | 写入文件的数据格式,如%d |
多维数据读取 语法格式:np.fromfile(frame,dtype,count,sep)
参数 | 描述 |
---|
frame | 文件,字符串 | dtype | 读取数据类型 | count | 读入元素个数 | sep | 数据分割字符串 |
这种方法存取时需要知道存入文件时数组的维度和元素类型
案例3:存储并读取一个包含维数据的文件
随机数函数
np.random的随机数函数
函数 | 描述 |
---|
rand(d0,d1,…dn) | 根据d0-dn创建随机数数组,浮点数,范围[0,1),均匀分布 | randn(d0,d1…dn) | 根据d0-dn创建随机数函数,正态分布 | ranint(low,high,shape) | 根据shape创建随机整数,范围为(low,high) | seed(s) | 随机数种子s | shuffle(a) | 根据数组第一个轴随机排列,改变原数组 | permutation(a) | 根据数组第一个轴随机排列,不改变原数组 | choice(a[,size,replace,p]) | 从一维数组中以概率p抽取元素,形成size形状的新数组,replace代表是否可以重用元素,默认Flase | uniform(low,high,size) | 产生具有均匀分布的数组,范围(low,high),size代表形状 | normal(loc,scale,size) | 产生具有正态分布的数组,loc代表均值,scale代表标准差,size代表形状 | poisson(lam,size) | 产生具有泊松分布的数组,lam代表随机事件发生率,size代表形状 |
案例4:使用随机数函数生成随机数组
下面我们对生成的数组进行变化
下面我们分别生成具有均匀分布和正态分布特征的数组
统计函数
函数 | 描述 |
---|
sum(a,axis) | 根据axis 计算数组a中相关元素之和 | mean(a,axis) | 根据axis计算数组a相关元素期望 | average(a,axis,weights) | 根据axis计算数组a相关元素加权平均值 | std(a,axis) | 根据axis计算数组a相关元素标准差 | var(a,axis) | 根据axis计算数组a相关元素方差 | min(a)/max(a) | 计算数组中的最小/最大元素 | argmin(a)/argmax(a) | 数组中最小/最大元素降一维对应的下标 | unravel_index(index,shape) | 将一维坐标转换为多维shape状 | ptp(a) | 数组中最小和最大元素数值之差 | median(a) | 数组中元素的中位数 |
案例5:使用统计函数进行计算
下面我们尝试获得数组中的最小和最大值
梯度函数
函数 | 描述 |
---|
np.gradient(f) | 计算数组f中元素的梯度,当f为多维,返回每个维度的梯度 |
案例6:梯度函数小测
|