Python打卡Day14
三维及以上数组用于表示更复杂的结构,如三维空间数据(体积像素)、视频帧序列(时间 + 空间维度)、张量(机器学习中的高维数据)等。数组的维度是数组的核心属性之一,它决定了数据的组织形式和结构,对数据存储、访问、运算及算法设计都有着至关重要的影响。线性结构的代表 一维数组是最简单的数组形式,数据按顺序排列成一条 “直线”,类似数学中的向量。由结果可知该shap数组为三维数组,可以利用上面学习的数组操
·
数组的常见操作和形状
一、创建不同维度的numpy数组
数组的维度是数组的核心属性之一,它决定了数据的组织形式和结构,对数据存储、访问、运算及算法设计都有着至关重要的影响。
1.1一维数组
线性结构的代表 一维数组是最简单的数组形式,数据按顺序排列成一条 “直线”,类似数学中的向量。
- 适用场景:存储线性序列数据(如学生成绩列表、每日气温记录)。
- 存储特点:在内存中占据连续的存储空间,通过下标(索引)直接访问元素。
import numpy as np
# 创建一维数组
arr1 = np.array([1, 2, 3, 4, 5])
print("一维数组 (从列表):")
print(arr1)
1.2二维数组:表格与矩阵的抽象
二维数组可视为 “数组的数组”,数据按行和列排列,类似表格或矩阵。
- 适用场景:存储二维数据(如电子表格中的学生信息、图像像素矩阵)。
- 存储特点:在内存中按行优先或列优先原则连续存储(不同编程语言可能不同),访问元素需指定行号和列号,例如
arr[i][j]。
# 创建二维数组
arr_2d_1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("\n二维数组 (从嵌套列表):")
print(arr_2d_1)
1.3多维数组:高维数据的建模
三维及以上数组用于表示更复杂的结构,如三维空间数据(体积像素)、视频帧序列(时间 + 空间维度)、张量(机器学习中的高维数据)等。
arr_3d_1 = np.array([
[[1, 2], [3, 4]],
[[5, 6], [7, 8]],
[[9, 10], [11, 12]]
])
print("三维数组 (从嵌套列表):")
print(arr_3d_1)
print(f"形状: {arr_3d_1.shape}")
1.4创建随机数组
我们经常需要对数据进行随机化处理,以确保模型的泛化能力。
| 方法 | 作用范围/分布 | 典型应用场景 | 示例 |
|---|---|---|---|
np.random.randint(a,b) |
[a,b]整数 | 生成随机索引/标签 | np.random.randint(1,10) → 7 |
random.random() |
[0,1)浮点数 | 简单概率模拟 | random.random() → 0.548 |
np.random.rand() |
[0,1)均匀分布 | 蒙特卡洛模拟 | np.random.rand(3) → [0.2,0.5,0.8] |
np.random.randn() |
标准正态分布(μ=0,σ=1) | 数据标准化/深度学习初始化 | np.random.randn(2,2) → [[-0.1,1.2],[0.5,-0.3]] |
# 创建一个2*2的随机数组c,区间为[0,1)
c = np.random.rand(2, 2)
二、numpy数组简单运算与索引
2.1数组的索引
import numpy as np
np.random.seed(42) # 设置随机种子以确保结果可重复
# 生成10个语文成绩(正态分布,均值75,标准差10)
chinese_scores = np.random.normal(75, 10, 10).round(1)
# 找出最高分和最低分及其索引
max_score = np.max(chinese_scores)
max_index = np.argmax(chinese_scores)
min_score = np.min(chinese_scores)
min_index = np.argmin(chinese_scores)
print(f"所有成绩: {chinese_scores}")
print(f"最高分: {max_score} (第{max_index}个学生)")
print(f"最低分: {min_score} (第{min_index}个学生)")
np.max()和np.min():分别返回数组中的最大值和最小值np.argmax()和np.argmin():分别返回最大值和最小值在数组中的索引位置
一维数组索引
# 1取出数组的第一个元素。
chinese_scores[0]
# 取出数组的最后一个元素。-1表示倒数第一个元素。
chinese_scores[-1]
# 切片取出索引
chinese_scores[2:6] # 取出索引为2到5的元素(不包括索引6的元素,取左不取右)
# 取出数组中从头到索引 5 (不包含 5) 的元素。
# 使用切片 slice [:stop]
chinese_scores[:5]
# 取出数组中从索引 4 到结尾的元素。
# 使用切片 slice [start:]
chinese_scores[4:]
# 7取出数组中所有偶数索引对应的元素 。
# 使用带步长的切片 slice [start:stop:step]
chinese_scores[::2]
二维数组索引
arr2d = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]])
arr2d
在二维数组 arr2d 里,第一个索引值代表行,第二个索引值代表列。比如 arr2d[i, j] ,i 是行索引,j 是列索引。
# 取出第 1 行 (索引为 1) 的所有元素。
# 使用索引 arr[row_index, :] 或 arr[row_index]
arr2d[1, :]
# 取出位于第 2 行 (索引 2)、第 3 列 (索引 3) 的元素。
# 使用 arr[row_index, column_index]
arr2d[2, 3]
# 取出由第 0 行和第 2 行组成的新数组。
# 使用整数数组作为行索引 arr[[row1, row2, ...], :]
arr2d[[0, 2], :]
# 取出由第 1 列和第 3 列组成的新数组。
# 使用整数数组作为列索引 arr[:, [col1, col2, ...]]
arr2d[:, [1, 3]]
# 取出一个 2x2 的子矩阵,包含元素 6, 7, 10, 11。
# 使用切片 slice arr[row_start:row_stop, col_start:col_stop]
arr2d[1:3, 1:3]
三维数组索引
#创建一个形状为3 * 4 * 5 = 60的数组
arr3d = np.arange(3 * 4 * 5).reshape((3, 4, 5))
# 选择特定的层
# 提取第 2 个块的所有数据
arr3d[1, :, :]
#提取第 2 个块的前 2 行
arr3d[1, 0:2, :]
#提取第 2 个块的前 2 行中的部分列
arr3d[1, 0:2, 2:4]
2.2数据的遍历
import numpy as np
scores = np.array([5, 9, 9, 11, 11, 13, 15, 19])
scores += 1 # 学习一下这个写法,等价于 scores = scores + 1
sum = 0
for i in scores: # 遍历数组中的每个元素
sum += i
print(sum)
2.3数组的运算
- 矩阵乘法:需要满足第一个矩阵的列数等于第二个矩阵的行数,和线代的矩阵乘法算法相同。
- 矩阵点乘:需要满足两个矩阵的行数和列数相同,然后两个矩阵对应位置的元素相乘。
- 矩阵转置:将矩阵的行和列互换。
- 矩阵求逆:需要满足矩阵是方阵且行列式不为0,然后使用伴随矩阵除以行列式得到逆矩阵。
- 矩阵求行列式:需要满足矩阵是方阵,然后使用代数余子式展开计算行列式。
import numpy as np
a = np.array([[1, 2], [3, 4], [5, 6]])
b = np.array([[7, 8], [9, 10], [11, 12]])
print(a)
print(b)
print(a + b) # 计算两个数组的和
print(a - b) # 计算两个数组的差
print(a / b) # 计算两个数组的除法
print(a * b) # 矩阵点乘,ipynb文件中不使用print()函数会自动输出结果,这是ipynb文件的特性
print(a @ b.T) # 矩阵乘法,3*2的矩阵和2*3的矩阵相乘,得到3*3的矩阵
三、SHAP值的深入理解
import shap
import matplotlib.pyplot as plt
# 初始化 SHAP 解释器
explainer = shap.TreeExplainer(rf_model)
# 计算 SHAP 值(基于测试集),这个shap_values是一个numpy数组,表示每个特征对每个样本的贡献值
shap_values = explainer.shap_values(X_test)
由结果可知该shap数组为三维数组,可以利用上面学习的数组操作函数对该数组进行同样操作
# # --- SHAP 特征重要性条形图 (Summary Plot - Bar) ---
print("--- 1. SHAP 特征重要性条形图 ---")
shap.summary_plot(shap_values[:, :, 0], X_test, plot_type="bar",show=False) # 这里的show=False表示不直接显示图形,这样可以继续用plt来修改元素,不然就直接输出了
plt.title("SHAP Feature Importance (Bar Plot)")
plt.show()
shap_values[:, :, 0]:- SHAP 值数组,通常是三维的(样本数 × 特征数 × 类别数)
[:, :, 0]表示选择所有样本、所有特征的第一个类别(适用于多分类问题)- 注意:如果是二分类或回归问题,可能只需使用
shap_values或shap_values[:, :]
X_test:- 测试数据集的特征矩阵,用于显示特征名称
- SHAP 值与特征名称会一一对应
plot_type="bar":- 指定绘制条形图(默认是蜂群图,更详细)
- 条形图只显示特征重要性的绝对值大小,不展示方向(正负影响)
show=False:- 不立即显示图形,允许后续使用
matplotlib自定义修改 - 例如添加标题、调整布局等
- 不立即显示图形,允许后续使用
更多推荐



所有评论(0)