数组的常见操作和形状

一、创建不同维度的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 自定义修改
    • 例如添加标题、调整布局等

 

 @浙大疏锦行

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐