笔记 / NumPy · 更新于 2026-10-15

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)

重要区别


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. 常见技巧与注意事项


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}")