NumPy入门及基本操作
NumPy是一个开源的Python科学计算基础库,可以用import numpy as np
引入,通常简写为np。
NumPy的特色是多维数组对象:ndarray,由实际的数据和描述这些数据的元数据构成。ndarray数组一般要求所有元素类型相同(同质),数组下标从0开始。ndarray数据类型具有众多有点。数组对象可以去掉元素间运算所需的循环,使一维向量更像单个数据。通过设置专门的数组对象,经过优化,可以提升这类应用的运算速度。数组对象采用相同的数据类型,有利于节省运算和存储空间。非同质ndarray元素为对象类型无法有效发挥NumPy优势,尽量避免使用。
ndarray数组的属性
轴(axis):保存数据的维度
秩(rank):轴的数量
属性 | 说明 |
---|---|
.ndim | 秩,即轴的数量或维度的数量 |
.shape | ndarray对象的尺度,对于矩阵n行m列 |
.size | ndarray对象元素的个数,相当于.shape中n×m的值 |
.dtype | ndarray对象的元素类型 |
.itemsize | ndarray对象中每个元素的大小,以字节为单位 |
ndarray数组的创建
- 从Python中的列表、元组等类型创建ndarray数组
# 从列表类型创建
x = np.array([0, 1, 2, 3])
# 从元组类型创建
x = np.array((0, 1, 2, 3))
# 从列表和元组混合类型创建
x = np.array([[1, 2], [9, 8], (0.1, 0.2)])
- 使用NumPy中函数创建ndarray数组,如arrange, ones, zeros等
# 生成从0到10的一维数组,默认整数类型
x = np.arange(10)
# 生成3行6列的全1数组,默认浮点数类型
x = np.ones((3, 6))
# 生成3行6列的全0数组,指定整数类型
x = np.zeros((3, 6), dtype=np.int32)
# 生成5×5的单位矩阵,默认浮点数类型
x = np.eyes(5)
# 根据数组x的形状生成一个全0数组
y = np.zeros_like(x)
# 根据数组x的形状生成一个全1数组
y = np.ones_like(x)
# 根据数组x的形状生成一个全2数组
y = np.full_like(x, 2)
- 使用NumPy中其他函数创建ndarray数组
# 根据起止数据等间距地填充4个数据,默认浮点数类型
x = np.linspace(1, 10, 4, endpoint=False)
# 将两个或多个数组合并成一个新的数组
z = np.concatenate((a, b))
ndarray数组的变换
- ndarray数组的维度变换
# 返回一个(3, 8)形状的数组,reshape不改变原数组而resize改变原数组
x = np.ones((2, 3, 4), dtype=np.int32)
y = x.reshape((3, 8))
x.resize((3, 8))
# 将数组降维得到一维数组,不改变原数组
y = x.flatten()
- ndarray数组的类型变换
# 改变数组类型,不改变原数组
y = x.astype(np.float)
- ndarray数组向列表的转换
# ndarray数组转化为列表,改变原数组
x.tolist()
ndarray数组的索引和切片
索引:获取数组中特定位置元素的过程
切片:获取数组元素子集的过程
- 一维数组的索引和切片
x = np.array([9, 8, 7, 6, 5])
# 索引同列表
y = x[2] # 7
# 切片[起始编号:终止编号(不含):步长]
y = x[1:4:2] # array([8, 6])
- 多维数组的索引和切片
x = np.arange(24).reshape((2, 3, 4))
'''
array([[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]])
'''
# 索引
y = x[1, 2, 3] # 23
y = x[0, 1, 2] # 6
y = x[-1, -2, -3] # 17
# 切片
y = x[:, 1, -3] # array([5, 17])
# 指定第二个维度的元素1至3(不含)
y = x[:, 1:3, :]
'''
array([[[ 4 5 6 7]
[ 8 9 10 11]]
[[16 17 18 19]
[20 21 22 23]]])
'''
# 指定第三个维度的步长为2
y = x[:, :, ::2]
'''
array([[[ 0 2]
[ 4 6]
[ 8 10]]
[[12 14]
[16 18]
[20 22]]])
'''
ndarray数组的运算
- 数组与标量之间的运算
数组与标量之间的运算作用于数组的每一个元素。
x = np.arange(24).reshape((2, 3, 4))
x = x / x.mean() # 计算x与元素平均值的商
- NumPy一元函数的运算
函数 | 说明 |
---|---|
np.abs(x) np.fabs(s) | 绝对值 |
np.sqrt | 平方根 |
np.square | 平方 |
np.log(x) np.log10(x) np.log2(x) | 自然对数、10底对数和2底对数 |
np.ceil(x) np.floor(x) | ceiling值或floor值 |
np.rint(x) | 四舍五入值 |
np.cos(x) np.sin(x) np.tan(x) | 三角函数值 |
np.exp(x) | 指数值 |
np.sign(x) | 符号值(-1(+),0,1(-)) |
- NumPy二元函数的运算
函数 | 说明 |
---|---|
+ - * / | 加减乘除 |
np.maximum(x,y) np.minimum(x,y) | 元素级最大最小值 |
np.mod(x,y) | 元素级模运算 |
np.copysign(x,y) | 将数组y中各元素值的符号赋值给数组x对应元素 |
> < >= <= == != | 算术比较返回布尔型数组 |
数据的文件存取
csv文件
- 写入
np.savetxt(frame, array, fmt='%.18e', delimiter=None)
frame:通常为文件路径字符串,也可以是文件、产生器或.gz/.bz2的压缩文件
array:存入文件的数组
fmt:写入文件的格式,如%d/%.2f/%.18e等
delimiter:分割字符串,默认是任何空格
x = np.arange(100).reshape(5, 20)
np.savetxt('x.csv', x, fmt='%d', delimiter=',')
- 读取
np.loadtxt(frame, dtype=np.float, delimiter=None, unpack=False)
frame:通常为文件路径字符串,也可以是文件、产生器或.gz/.bz2的压缩文件
dtype:数据类型,默认浮点型
delimiter:分割字符串,默认是任何空格
unpack:如果True,读入属性将分别写入不同变量
x = np.loadtxt('x.csv', delimiter=',')
dat文件
- 写入
a.tofile(frame, sep=' ', format='%s')
frame:通常为文件路径字符串,也可以是文件、产生器或.gz/.bz2的压缩文件
sep:数据分割字符串,如果是空串,写入文件为二进制
format:写入文件的格式
x = np.arange(100).reshape(5, 20, 2)
x.tofile('x.dat', sep=',', format='%d')
- 读取
np.fromfile(frame, dtype=float, count=-1, sep=' ')
frame:通常为文件路径字符串,也可以是文件、产生器或.gz/.bz2的压缩文件
dtype:数据类型,默认浮点型
count:读入元素个数,-1表示读入整个文件
sep:数据分割字符串,如果是空串,写入文件为二进制
x = np.fromfile('x.dat', dtype=np.int, sep=',').reshape(5, 10, 2)
npy文件
写入np.save(fname, array)
或np.savez(fname, array)
读取np.load(fname)
x = np.arange(100).reshape(5, 20, 2)
np.save('x.npy', x)
y = np.load('x.npy')
NumPy中的随机数
函数 | 说明 |
---|---|
rand(d0, d1, …, dn) | 创建随机数数组,浮点数[0,1)均匀分布 |
randn(d0, d1, …, dn) | 创建随机数数组,标准正态分布 |
randint(low[, high, shape]) | 创建随机整数或整数数组,范围是[low, high) |
seed(s) | 创建随机数数组,标准正态分布 |
shuffle(a) | 根据数组a的第1轴进行行随机排列,改变原数组 |
permutation(a) | 根据数组a的第1轴产生一个新的乱序数组,不改变原数组 |
choice(a[, size, replace, p]) | 从一维数组a中以概率p抽取元素,形成size形状新数组,replace表示元素是否重用,默认不重用 |
uniform(low, high, size) | 产生具有均匀分布的数组,low起始值,high结束值,size形状 |
normal(loc, scale, size) | 产生具有正态分布的数组,loc均值,scale标准差,size形状 |
poisson(lam, size) | 产生具有泊松分布的数组,lam随机事件发生率,size形状 |
NumPy的统计函数
函数 | 说明 |
---|---|
sum(a, axis=None) | 元素的和(根据给定轴axis) |
mean(a, axis=None) | 元素的期望 |
average(a, axis=None, weight=None) | 元素的加权平均值 |
std(a, axis=None) | 元素的标准差 |
var(a, axis=None) | 元素的方差 |
min(a) max(a) | 元素的最小最大值 |
argmin(a) argmax(a) | 元素最小最大值的降一维后下表 |
unravel_index(index, shape) | 将一维下标转换成多维下标 |
ptp(a) | 元素最大与最小值的差 |
median(a) | 元素的中位数 |
NumPy的梯度函数
函数 | 说明 |
---|---|
np.gradient(a) | 计算数组a中元素的梯度,当a为多维时返回每个维度的梯度 |
注:梯度是指连续值之间的变化率,即斜率。
Reference:
https://www.icourse163.org/learn/BIT-1001870002?tid=1450349444#/learn/announce