一、安装与导入
1. 安装
# pip安装
pip install numpy
# conda安装(anaconda环境)
conda install numpy
2. 导入(行业统一规范别名 np)NumPy
import numpy as np
# 查看版本
print(np.__version__)
二、ndarray 数组基础(核心对象,同类型连续内存,运算远快原生 list)
2.1 数组创建 5 种常用方式
# 1.从Python列表创建一维/二维数组
arr1 = np.array([1,2,3,4]) # 一维
arr2 = np.array([[1,2],[3,4],[5,6]]) # 二维(3行2列)
# 2.快速生成固定值数组
zero = np.zeros((3,4)) # 3行4列全0浮点数组
one = np.ones((2,3)) # 2行3列全1
full = np.full((2,2), 8) # 2×2全部填充8
# 3.等差数组(左闭右开)
ar1 = np.arange(0,10,2) # [0 2 4 6 8] 起始,终止,步长
ar2 = np.linspace(1,10,5) # [1. 3.25 5.5 7.75 10.] 均分5个点
# 4.生成和原数组同形状数组
arr = np.array([[1,2],[3,4]])
zero_like = np.zeros_like(arr)
# 5.空数组(只开辟内存不赋值)
empty = np.empty((2,3))
2.2 ndarray 五大核心属性
arr = np.array([[1,2,3],[4,5,6]])
print(arr.ndim) # 维度:2
print(arr.shape) # 形状:(2,3) 行,列
print(arr.size) # 总元素数:6
print(arr.dtype) # 元素数据类型:int64/float64
print(arr.itemsize)# 单个元素字节数
2.3 指定数据类型 dtype
# 指定int32/float32,节省内存
arr_int = np.array([1,2,3], dtype=np.int32)
arr_float = np.array([1,2], dtype=np.float32)
# 类型转换
arr = arr_int.astype(np.float64)
三、索引与切片(重点)
3.1 一维数组
a = np.array([0,1,2,3,4,5])
print(a[2]) # 单个取值:2
print(a[1:4]) # 切片[1,2,3] 左闭右开
print(a[::2]) # 步长2 [0,2,4]
print(a[::-1]) # 反转数组
3.2 二维数组(行,列)
b = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(b[0,1]) # 第0行第1列:2
print(b[1:3,:]) # 第1、2行,所有列
print(b[:, 0]) # 全部行,第0列
print(b[0:2,1:3]) # 前两行,后两列
3.3 布尔索引(条件筛选)
arr = np.array([1,5,3,8,2])
mask = arr>3 # [False True False True False]
res = arr[mask] # [5,8] 取出大于3的元素
3.4 花式索引
arr = np.array([10,20,30,40])
print(arr[[0,2,3]]) # 指定下标取值 [10,30,40]
四、数组变形、拼接、拆分
4.1 形状变换 reshape
arr = np.arange(6)
arr2 = arr.reshape(2,3) # 一维→2行3列
# 展平为一维
arr.flatten() # 返回新数组
arr.ravel() # 尽量返回原数组视图
4.2 数组拼接(vstack/hstack/concatenate)
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
np.vstack([a,b]) # 竖直上下拼接(行增加)
np.hstack([a,b]) # 水平左右拼接(列增加)
# axis=0竖直,axis=1水平
np.concatenate([a,b],axis=0)
4.3 数组拆分 split
arr = np.arange(9).reshape(3,3)
res = np.split(arr,3,axis=0) # 按行切3份
4.4 新增维度 newaxis
arr = np.array([1,2,3]) # (3,)
arr_row = arr[np.newaxis,:] # (1,3)行向量
arr_col = arr[:,np.newaxis] # (3,1)列向量
五、数组运算(向量化,无需 for 循环)
5.1 标量运算(数组和单个数字)
arr = np.array([1,2,3])
print(arr+2) # [3,4,5]
print(arr*3) # [3,6,9]
print(arr**2)# [1,4,9]
5.2 同形状数组逐元素运算
a = np.array([1,2])
b = np.array([3,4])
print(a+b,a-b,a*b,a/b) # 加减乘除都是逐元素
⚠️
*是逐元素相乘,矩阵乘法用 @ /np.dot ()
m1 = np.array([[1,2],[3,4]])
m2 = np.array([[5,6],[7,8]])
res = m1 @ m2 # 矩阵乘法
res2 = np.dot(m1,m2)
5.3 常用数学函数(逐元素)
arr = np.array([1,4,9])
np.sqrt(arr) # 开方
np.exp(arr) # e^x
np.log(arr) # ln
np.sin(arr) # 正弦
np.abs(arr) # 绝对值
np.round(arr,2)# 四舍五入
六、广播机制(NumPy 核心难点:不同 shape 数组自动运算)
规则:维度从右往左对齐,缺的维度补 1;维度为 1 可自动拓展匹配
# 例1:(3,1) + (1,4) → (3,4)
a = np.array([[1],[2],[3]]) # (3,1)
b = np.array([10,20,30,40])# (4,)→(1,4)
print(a+b)
# 例2:数组+标量本质是广播
arr = np.array([1,2,3])
arr + 5
七、统计聚合函数(axis 控制行列运算,axis=0 列方向、axis=1 行方向)
arr = np.array([[1,2,3],[4,5,6]])
print(np.sum(arr)) # 全部求和:21
print(np.sum(arr,axis=0)) # 按列求和 [5,7,9]
print(np.sum(arr,axis=1)) # 按行求和 [6,15]
# 其他统计
np.mean(arr) # 平均值
np.max(arr) # 最大值
np.min(arr) # 最小值
np.median(arr) # 中位数
np.var(arr) # 方差
np.std(arr) # 标准差
np.argmax(arr) # 最大值下标
np.argmin(arr) # 最小值下标
八、随机数 np.random 模块
# 固定随机种子,结果可复现
np.random.seed(42)
# 1.0~1均匀分布
r1 = np.random.rand(3,2)
# 2.正态分布(均值0,方差1)
r2 = np.random.randn(2,3)
# 3.整数随机数 [low,high)
r3 = np.random.randint(1,10,size=(3,3))
# 4.随机打乱数组
arr = np.array([1,2,3,4])
np.random.shuffle(arr)
九、文件 IO:数组保存与读取
arr = np.array([[1,2],[3,4]])
# 保存二进制npy
np.save("data.npy", arr)
data = np.load("data.npy")
# 读写csv文本
np.savetxt("data.csv", arr, delimiter=",")
data_csv = np.loadtxt("data.csv", delimiter=",")
十、高频实用函数
# 1.去重
arr = np.array([1,1,2,3,3,3])
unique = np.unique(arr) # [1,2,3]
# 2.非零元素统计
np.count_nonzero(arr>2)
# 3.查找非零下标
np.argwhere(arr>2)
# 4.替换:条件赋值
arr[arr<2]=0
十一、实战小案例:归一化数据
# 把数据缩放到[0,1]
data = np.array([10,20,30,40,50])
norm = (data - np.min(data))/(np.max(data)-np.min(data))
print(norm)
十二、速查清单(备忘)
| 分类 | 常用 API |
|---|---|
| 创建 | array/zeros/ones/full/arange/linspace |
| 变形 | reshape/flatten/ravel/newaxis |
| 拼接 | vstack/hstack/concatenate |
| 运算 | +-*/ @ dot sqrt exp log |
| 统计 | sum/mean/max/min/std/argmax |
| 随机 | rand/randn/randint/seed/shuffle |