目录
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文件1
打开文件我们可以看到里面的数据
csv文件读取
语法格式[^2]:np.loadtxt(frame,dtype,delimiter,unpack)
参数 | 描述 |
---|---|
frame | 文件(可以为压缩文件),字符串或产生器 |
dtype | 数据类型 |
delimiter | 分割字符串 |
unpack | 为True时,读入变量被写入不同属性 |
[^2]:注意: | |
1, csv只能有效存储一维和二维数据 | |
2, np中的存储和读取函数都只能有效存储一维和二维数据 |
案例2:使用loadtxt()函数读取一个csv文件
多维数据存取
多维数据存储
语法格式:array.tofile(frame,sep,format)
参数名 | 描述 |
---|---|
frame | 文件,字符串 |
seq | 分割字符串 |
format | 写入文件的数据格式,如%d |
多维数据读取
语法格式:np.fromfile(frame,dtype,count,sep)
参数 | 描述 |
---|---|
frame | 文件,字符串 |
dtype | 读取数据类型 |
count | 读入元素个数 |
sep | 数据分割字符串 |
这种方法存取时需要知道存入文件时数组的维度和元素类型[^3] | |
[^3]:多维数据存储(tofile()函数)和读取方法(fromfile()函数)需要配合使用,可以通过元数据文件来存储额外信息 |
案例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为多维,返回每个维度的梯度1 |
1:梯度是连续值之间的变化率,即斜率 |