ndarray 数组创建
常用创建方法
py
# 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):全部填充同一个数字
py
#生成一维数组,10个为0
a5 = np.full(10, 0)
#生成二维数组,4个为5
a6 = np.full((2,2), 5)
序列数组
np.arange(start, stop, step, dtype)
py
# 1. 只给终点:默认从0开始,步长1
print(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)
py
np.random.rand(3) # 随机数范围[0,1)均匀分布 一维
np.random.rand(2,3) # 2行3列随机浮点数
设置随机数
py
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 个等比数
py
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^2
linspace
np.linspace(start, stop, num)
适合:需要固定多少个点,不用自己算步长
py
c2 = np.linspace(0, 2, 5)
print(c2) # [0. 0.5 1. 1.5 2. ]
NumPy ndarray 常用数组属性
举例数组
py
import numpy as np
arr = np.array([[1,2,3],[4,5,6]])
维度 / 形状相关
.ndim
数组维度数量,返回整数
py
print(arr.ndim) # 2,二维数组
.shape
每个维度的长度,返回元组
py
print(arr.shape) # (2,3) 2行3列
# 单独取行数/列数
print(arr.shape[0]) # 行数 2
print(arr.shape[1]) # 列数 3
.size
数组总元素个数 = 各维度相乘
py
print(arr.size) # 2*3=6
.itemsize
单个元素占用字节数
py
# int64 每个数字占8字节
print(arr.itemsize) # 8
.nbytes
整个数组占用总字节 = size × itemsize
py
print(arr.nbytes) # 6*8=48
数据类型相关
.dtype
数组元素的数据类型
py
print(arr.dtype) # int64
.dtype.name
类型名字符串
py
print(arr.dtype.name) # int64
补充:
虽然.dtype和.dtype.name直接打印出的都是int64,但是他们的类型本质不一样
py
print(type(arr.dtype)) # <class 'numpy.dtypes.Int64DType'>
print(type(arr.dtype.name)) # <class 'str'>
数组变形
.reshape
py
arr.reshape(2,3) # 转为2行3列,不修改原数组
.resize
py
arr.resize(2,3) # 原地修改形状
.flatten
py
arr.flatten() # 展平一维(拷贝)
.ravel
py
arr.ravel() # 展平(优先视图,节省内存)
数组类型转换
.astype
py
print(arrA.astype(np.float32))
基本函数
常量
py
np.pi # 圆周率
np.e # 自然常数
np.nan # 空值
np.inf # 无穷大
舍入取整函数
例子数组
py
x = np.array([1.2, 1.5, -1.5, 2.7])
.ceil
向上取整
py
np.ceil(x) # 向上取整 [2,2,-1,3]
.floor
向下取整
py
np.floor(x) # 向下取整 [1,1,-2,2]
.rint
四舍五入
py
np.rint(x) # 四舍五入 [1.,2.,-2.,3.]
.trunc
截断小数
py
np.trunc(x) # 截断小数 [1,1,-1,2]
.round
指定小数位数
py
np.round(x, 1) # 指定小数位数
平方、开方、绝对值
py
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]) # 平方根,负数会nan
np.cbrt(np.array([-8,8])) # 立方根 [-2,2]
指数 & 对数函数
py
np.exp(x) # e^x
np.exp2(x) # 2^x
np.log([1, np.e, np.e**2]) # 自然对数 ln
np.log10([1,10,100]) # 以10为底
np.log2([1,2,4]) # 以2为底
二元函数(两个数组对应位置运算)
py
np.add(a, b) # 加 a+b
np.subtract(a,b) # 减 a-b
np.multiply(a,b) # 乘 a*b
np.divide(a,b) # 除 a/b
np.power(a, b) # 幂 a**b
np.maximum(a,b) # 对应位置取大
np.minimum(a,b) # 对应位置取小
np.mod(a,b) # 取余
条件筛选
三目选择(条件成立取 x,否则取 y)
py
np.where(arr > 4, arr * 2, arr + 10)
print(res)
# 大于4的数×2,其余+10
聚合统计函数(整数组 / 按轴计算)
py
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):返回排序后的新数组,不改动原数组
py
import numpy as np
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
py
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:返回原数组映射到唯一值的索引
py
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():标准数学矩阵乘法
元素相乘(对位相乘)
py
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列
py
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]]
计算过程:
