NumPy常用函数
ndarray 数组创建
常用创建方法
# 1. 一维数组a1=np.array([1,2,3,4])# 2. 二维数组(嵌套列表)a2=np.array([[1,2],[3,4]])# 3. 指定数据类型a3=np.array([1.1,2.2],dtype=np.float32)# 4. 元组也可以a4=np.array((5,6,7))快速生成固定值数组
np.full(shape, fill_value):全部填充同一个数字
#生成一维数组,10个为0a5=np.full(10,0)#生成二维数组,4个为5a6=np.full((2,2),5)序列数组
np.arange(start, stop, step, dtype)
# 1. 只给终点:默认从0开始,步长1print(np.arange(10))# [0 1 2 3 4 5 6 7 8 9]# 2. 起点+终点print(np.arange(2,8))# [2 3 4 5 6 7]# 3. 起点+终点+步长print(np.arange(0,10,2))# [0 2 4 6 8]# 4. 支持小数print(np.arange(0,1,0.2))# [0. 0.2 0.4 0.6 0.8]随机数模块(np.random)
np.random.rand(3)# 随机数范围[0,1)均匀分布 一维np.random.rand(2,3)# 2行3列随机浮点数设置随机数
print(np.random.randint(0,5,size=(2,2)))#生成二维数组,0到5的随机数(不包含5)等比/等差数列
logspace
np.logspace(start_exp, stop_exp, num, base=10)
含义:生成 base 的 start_exp ~ stop_exp 次方,共 num 个等比数
c1=np.logspace(0,2,5)print(c1)# [ 1. 3.16227766 10. 31.6227766 100. ]# 对应:10^0, 10^0.5, 10^1, 10^1.5, 10^2linspace
np.linspace(start, stop, num)
适合:需要固定多少个点,不用自己算步长
c2=np.linspace(0,2,5)print(c2)# [0. 0.5 1. 1.5 2. ]NumPy ndarray 常用数组属性
举例数组
importnumpyasnp arr=np.array([[1,2,3],[4,5,6]])维度 / 形状相关
.ndim
数组维度数量,返回整数
print(arr.ndim)# 2,二维数组.shape
每个维度的长度,返回元组
print(arr.shape)# (2,3) 2行3列# 单独取行数/列数print(arr.shape[0])# 行数 2print(arr.shape[1])# 列数 3.size
数组总元素个数 = 各维度相乘
print(arr.size)# 2*3=6.itemsize
单个元素占用字节数
# int64 每个数字占8字节print(arr.itemsize)# 8.nbytes
整个数组占用总字节 = size × itemsize
print(arr.nbytes)# 6*8=48数据类型相关
.dtype
数组元素的数据类型
print(arr.dtype)# int64.dtype.name
类型名字符串
print(arr.dtype.name)# int64补充:
虽然.dtype和.dtype.name直接打印出的都是int64,但是他们的类型本质不一样
print(type(arr.dtype))# <class 'numpy.dtypes.Int64DType'>print(type(arr.dtype.name))# <class 'str'>数组变形
.reshape
arr.reshape(2,3)# 转为2行3列,不修改原数组.resize
arr.resize(2,3)# 原地修改形状.flatten
arr.flatten()# 展平一维(拷贝).ravel
arr.ravel()# 展平(优先视图,节省内存)数组类型转换
.astype
print(arrA.astype(np.float32))基本函数
常量
np.pi# 圆周率np.e# 自然常数np.nan# 空值np.inf# 无穷大舍入取整函数
例子数组
x=np.array([1.2,1.5,-1.5,2.7]).ceil
向上取整
np.ceil(x)# 向上取整 [2,2,-1,3].floor
向下取整
np.floor(x)# 向下取整 [1,1,-2,2].rint
四舍五入
np.rint(x)# 四舍五入 [1.,2.,-2.,3.].trunc
截断小数
np.trunc(x)# 截断小数 [1,1,-1,2].round
指定小数位数
np.round(x,1)# 指定小数位数平方、开方、绝对值
a=np.array([1,4,9,-2])np.abs(a)# 绝对值 [1,4,9,2]np.square(a)# 平方 [1,16,81,4]np.sqrt(a[a>=0])# 平方根,负数会nannp.cbrt(np.array([-8,8]))# 立方根 [-2,2]指数 & 对数函数
np.exp(x)# e^xnp.exp2(x)# 2^xnp.log([1,np.e,np.e**2])# 自然对数 lnnp.log10([1,10,100])# 以10为底np.log2([1,2,4])# 以2为底二元函数(两个数组对应位置运算)
np.add(a,b)# 加 a+bnp.subtract(a,b)# 减 a-bnp.multiply(a,b)# 乘 a*bnp.divide(a,b)# 除 a/bnp.power(a,b)# 幂 a**bnp.maximum(a,b)# 对应位置取大np.minimum(a,b)# 对应位置取小np.mod(a,b)# 取余条件筛选
三目选择(条件成立取 x,否则取 y)
np.where(arr>4,arr*2,arr+10)print(res)# 大于4的数×2,其余+10聚合统计函数(整数组 / 按轴计算)
mat=np.array([[1,2,3],[4,5,6]])np.sum(mat)# 全部求和np.sum(mat,axis=0)# 按列求和np.sum(mat,axis=1)# 按行求和np.min(mat)# 最小值np.max(mat)# 最大值np.mean(mat)# 均值np.median(mat)# 中位数np.var(mat)# 方差np.std(mat)# 标准差np.argmax(mat)# 最大值索引np.argmin(mat)# 最小值索引# 一维a=np.array([1,2,3])#cumsum():累积和#cumprod():累积乘积print(a.cumsum())# [1 3 6]print(a.cumprod())# [1 2 6]排序函数
两种用法
arr.sort():原地排序,直接修改原数组,无返回值
np.sort(arr):返回排序后的新数组,不改动原数组
importnumpyasnp a=np.array([3,1,4,2])# 不修改原数组s1=np.sort(a)print(a)# [3 1 4 2]print(s1)# [1 2 3 4]# 原地修改a.sort()print(a)# [1 2 3 4]多维按轴排序 axis
mat=np.array([[3,1],[2,4]])# axis=1 每行内部排序print(np.sort(mat,axis=1))#[[1 3]#[2 4]]# axis=0 每列内部排序print(np.sort(mat,axis=0))#[[2 1]#[3 4]]去重函数
np.unique函数参数:
return_counts=True:顺带统计每个元素出现次数
return_index=True:返回元素第一次出现的下标
return_inverse=True:返回原数组映射到唯一值的索引
nums=np.array([2,2,1,1,3,3,3])# 基础去重uniq=np.unique(nums)print(uniq)# [1 2 3]# 去重+统计频次vals,cnt=np.unique(nums,return_counts=True)print(vals,cnt)NumPy 矩阵运算
极易混淆运算
* 和 np.multiply():对应元素相乘(哈达玛积),不是矩阵乘法
@ 和 np.dot() 和 np.matmul():标准数学矩阵乘法
元素相乘(对位相乘)
A=np.array([[1,2],[3,4]])B=np.array([[5,6],[7,8]])print(A*B)# [[ 5 12]# [21 32]]矩阵乘法(线性代数标准乘法)
操作规则为:A列必须等于B行,输出结构为A行B列
arrA=np.array([[1,0,2],[-1,3,1]])print(arrA)#[[ 1 0 2]#[-1 3 1]]arrB=np.array([[4,1],[0,5],[-2,3]])print(arrB)#[[ 4 1]#[ 0 5]#[-2 3]]# 操作规则为:A列必须等于B行,输出结构为A行B列print(arrA.dot(arrB))#[[ 0 7]#[-6 17]]计算过程:
