NumPy
1. 导入与版本
import numpy as np
print(np.__version__) # 查看版本
2. ndarray 数组核心属性
| 属性 |
说明 |
示例 |
ndim |
维度数 |
arr.ndim |
shape |
各维度长度(元组) |
arr.shape |
size |
元素总数 |
arr.size |
dtype |
数据类型 |
arr.dtype |
itemsize |
每个元素字节数 |
arr.itemsize |
nbytes |
总字节数 |
arr.nbytes |
arr = np.array([[1,2,3],[4,5,6]])
print(arr.ndim, arr.shape, arr.size) # 2, (2,3), 6
3. 创建数组
3.1 从列表/元组创建
np.array([1,2,3]) # 一维
np.array([[1,2],[3,4]]) # 二维
np.array([1,2], dtype=np.float32) # 指定类型
3.2 常用创建函数
| 函数 |
说明 |
示例 |
np.arange(start, stop, step) |
等差数列,左闭右开 |
np.arange(0,10,2) → [0,2,4,6,8] |
np.linspace(start, stop, num) |
均匀等分,含两端 |
np.linspace(0,1,5) → [0, 0.25, 0.5, 0.75, 1] |
np.zeros(shape) |
全0数组 |
np.zeros((2,3)) |
np.ones(shape) |
全1数组 |
np.ones((2,3), dtype=int) |
np.empty(shape) |
未初始化(随机值) |
np.empty((2,2)) |
np.zeros_like(arr) |
参照形状的全0 |
np.zeros_like(arr) |
np.ones_like(arr) |
参照形状的全1 |
np.ones_like(arr) |
np.full(shape, value) |
填充指定值 |
np.full((2,2), 7) |
np.eye(N) |
单位矩阵 |
np.eye(3) |
np.identity(N) |
单位矩阵(同eye) |
np.identity(3) |
|
|
|
3.3 随机数组
| 函数 |
说明 |
np.random.rand(d0,d1) |
[0,1) 均匀分布浮点数 |
np.random.randn(d0,d1) |
标准正态分布 N(0,1) |
np.random.randint(low, high, size) |
[low, high) 随机整数 |
np.random.uniform(low, high, size) |
[low, high] 均匀浮点数 |
np.random.seed(n) |
固定随机种子,保证可重复 |
np.random.shuffle(arr) |
原地打乱 |
np.random.permutation(arr) |
返回打乱后的副本 |
np.random.choice(arr, size, replace) |
随机抽样 |
np.random.seed(42)
arr = np.random.randint(0, 10, (3,4))
4. 数据类型与转换
| 类型 |
简写 |
说明 |
| 整数 |
int8, int16, int32, int64 |
默认 int64 |
| 无符号整数 |
uint8 |
0~255,常用于图像 |
| 浮点数 |
float16, float32, float64 |
默认 float64 |
| 布尔 |
bool |
True/False |
| 字符串 |
str 或 U |
dtype='U10' |
arr = np.array([1,2,3], dtype=np.float32)
arr2 = arr.astype(np.int64) # 类型转换(返回副本)
5. 索引与切片
5.1 一维数组
arr = np.array([10,20,30,40,50])
arr[0] # 10
arr[-1] # 50
arr[1:4] # [20,30,40]
arr[::2] # [10,30,50]
arr[::-1] # 反转 [50,40,30,20,10]
5.2 二维数组
arr = np.array([[1,2,3,4],
[5,6,7,8],
[9,10,11,12]])
arr[0,0] # 1
arr[1,2] # 7
arr[0] # 第0行 [1,2,3,4]
arr[:, 0] # 第0列 [1,5,9]
arr[0:2, 1:3] # 子矩阵 [[2,3],[6,7]]
5.3 布尔索引(条件筛选)
arr = np.array([1,2,3,4,5,6])
arr[arr > 3] # [4,5,6]
arr[(arr > 2) & (arr < 5)] # [3,4] 注意括号
arr[(arr > 2) | (arr < 0)] # 或条件
arr[arr % 2 == 0] # 偶数
5.4 花式索引(整数列表)
arr = np.array([10,20,30,40,50])
arr[[0,2,4]] # [10,30,50]
arr2d = np.array([[1,2],[3,4],[5,6]])
arr2d[[0,2], [1,0]] # [2,5] (0,1)和(2,0)
重要区别
- 切片 返回 视图(view),修改会影响原数组
- 布尔索引 / 花式索引 返回 副本(copy),修改不影响原数组
6. 数组运算
6.1 向量化算术
a = np.array([1,2,3,4])
b = np.array([10,20,30,40])
a + b # [11,22,33,44]
a * b # [10,40,90,160] 逐元素相乘
b / a # [10.,10.,10.,10.]
a ** 2 # [1,4,9,16]
a + 100 # 标量广播 [101,102,103,104]
6.2 通用函数 (ufunc)
| 函数 |
说明 |
np.sqrt(arr) |
平方根 |
np.exp(arr) |
指数 e^x |
np.log(arr) |
自然对数 |
np.sin(arr) |
正弦 |
np.abs(arr) |
绝对值 |
np.round(arr) |
四舍五入 |
np.floor(arr) |
向下取整 |
np.ceil(arr) |
向上取整 |
np.clip(arr, min, max) |
截断到区间 |
np.sign(arr) |
符号函数(-1,0,1) |
6.3 广播机制
规则:从后往前比较维度,若相等或其中一个是1,则可广播。
A = np.array([[1,2,3],[4,5,6]]) # (2,3)
b = np.array([10,20,30]) # (3,) → 自动扩展为 (2,3)
A + b # [[11,22,33],[14,25,36]]
col = np.array([[1],[2],[3]]) # (3,1)
row = np.array([10,20,30]) # (3,) → (1,3)
col + row # (3,3)
7. 矩阵乘法
| 运算符/函数 |
说明 |
* 或 np.multiply() |
逐元素相乘(形状相同) |
@ 或 np.dot() |
矩阵乘法(前列=后行) |
np.matmul() |
矩阵乘法(同@) |
A = np.array([[1,2],[3,4]])
B = np.array([[5,6],[7,8]])
A * B # 逐元素 [[5,12],[21,32]]
A @ B # 矩阵乘 [[19,22],[43,50]]
np.dot(A, B) # 同上
A.T # 转置 [[1,3],[2,4]]
8. 统计函数
| 函数 |
说明 |
np.sum(arr, axis) |
求和 |
np.mean(arr, axis) |
平均值 |
np.median(arr) |
中位数 |
np.max(arr, axis) |
最大值 |
np.min(arr, axis) |
最小值 |
np.std(arr, axis) |
标准差 |
np.var(arr, axis) |
方差 |
np.argmax(arr, axis) |
最大值索引 |
np.argmin(arr, axis) |
最小值索引 |
np.any(condition) |
只要有一个满足即True |
np.all(condition) |
全部满足才True |
axis参数:
- axis=0:按列操作(垂直方向)
- axis=1:按行操作(水平方向)
- 不指定则全局
arr = np.array([[1,2,3],[4,5,6]])
np.sum(arr, axis=0) # [5,7,9] 列和
np.sum(arr, axis=1) # [6,15] 行和
np.argmax(arr, axis=1) # [2,2] 每行最大列索引
9. 累积、排序、去重
arr = np.array([3,1,4,1,5,9,2,6])
np.cumsum(arr) # 累加 [3,4,8,9,14,23,25,31]
np.cumprod(arr) # 累乘
np.sort(arr) # 返回排序后副本 [1,1,2,3,4,5,6,9]
arr.sort() # 原地排序
np.argsort(arr) # 排序索引 [1,3,6,0,2,4,7,5]
np.unique(arr) # 去重 [1,2,3,4,5,6,9]
np.unique(arr, return_counts=True) # 同时返回计数
10. 条件函数 np.where()
arr = np.array([-3,-1,0,2,5])
# 形式1:三目运算
np.where(arr >= 0, arr, 0) # [0,0,0,2,5]
np.where(arr > 0, '正', '非正')
# 形式2:返回满足条件的索引
indices = np.where(arr > 0) # (array([3,4]),)
# 嵌套条件(等级划分)
scores = np.array([95,78,62,45,88])
grade = np.where(scores >= 90, '优秀',
np.where(scores >= 60, '及格', '不及格'))
11. 数组变形
| 方法 |
说明 |
arr.reshape(new_shape) |
返回视图,新形状乘积必须等于原size |
arr.resize(new_shape) |
原地修改,可放大(补0)或缩小 |
np.resize(arr, new_shape) |
返回副本,放大时循环重复 |
arr.T |
转置 |
arr.flatten() |
展开为一维(副本) |
arr.ravel() |
展开为一维(视图) |
arr = np.arange(12)
arr.reshape(3,4) # 3行4列
arr.reshape(2, -1) # 自动推断列数 (2,6)
arr.reshape(3,4, order='F') # 列优先填充
12. 数组合并
| 函数 |
说明 |
np.concatenate((a,b), axis) |
沿指定轴拼接 |
np.vstack((a,b)) |
垂直堆叠(行增加) |
np.hstack((a,b)) |
水平堆叠(列增加) |
np.stack((a,b), axis) |
沿新轴堆叠 |
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
np.vstack([a,b]) # [[1,2],[3,4],[5,6],[7,8]]
np.hstack([a,b]) # [[1,2,5,6],[3,4,7,8]]
np.concatenate([a,b], axis=0) # 等价vstack
13. 数组切割
| 函数 |
说明 |
np.split(arr, indices, axis) |
按索引位置切割 |
np.vsplit(arr, n) |
垂直切割(按行) |
np.hsplit(arr, n) |
水平切割(按列) |
np.array_split(arr, n, axis) |
允许不均匀切割 |
arr = np.arange(12).reshape(3,4)
np.hsplit(arr, 2) # 分成左右两块 (3,2) 和 (3,2)
np.vsplit(arr, 3) # 分成3行,每块 (1,4)
np.split(arr, [2], axis=1) # 在列索引2处切割
# 一维切割
arr1d = np.arange(10)
np.split(arr1d, [3,7]) # [0,1,2], [3,4,5,6], [7,8,9]
14. 文件读写
14.1 文本文件 (TXT/CSV)
# 保存
np.savetxt('data.csv', arr, delimiter=',', fmt='%d', header='col1,col2')
# 读取(无缺失值)
arr = np.loadtxt('data.csv', delimiter=',', skiprows=1, dtype=float)
# 读取(含缺失值,增强版)
arr = np.genfromtxt('data.csv', delimiter=',', skip_header=1,
missing_values='NA', filling_values=np.nan)
14.2 二进制文件 (.npy / .npz)
np.save('array.npy', arr)
arr = np.load('array.npy')
np.savez('arrays.npz', a=arr1, b=arr2)
data = np.load('arrays.npz')
data['a']
15. 常见技巧与注意事项
- 视图 vs 副本:切片通常返回视图,布尔/花式索引返回副本。修改视图会影响原数组,若需独立副本用
.copy()。
- 内存节约:用
np.asarray() 避免不必要的复制(输入已是 ndarray 时)。
- 随机种子:设置
np.random.seed(42) 确保结果可重现。
- 广播:记住“从后往前,相等或1”。
- 数据类型:图像用
uint8,科学计算用 float64。
- 性能:向量化运算比 Python 循环快几十倍,大数据量优先使用。
16. 综合示例:学生成绩分析
import numpy as np
# 5名学生3门课成绩
np.random.seed(42)
scores = np.random.randint(60, 100, (5, 3))
# 每生平均分
avg = np.mean(scores, axis=1)
# 总分最高者
total = np.sum(scores, axis=1)
top_student = np.argmax(total)
# 找出不及格(<60)
fail = scores[scores < 60]
# 低于70的提到70
cleaned = np.where(scores < 70, 70, scores)
# 按平均分降序排名
rank = np.argsort(-avg)
print(f"平均分: {avg}")
print(f"最高总分学生: {top_student}, 总分: {total[top_student]}")
print(f"不及格成绩: {fail}")
print(f"清洗后:\n{cleaned}")
print(f"排名: {rank}")