60天Python训练 day16

Numpy数组

NumPy 数组的维度 (Dimension) 或称为 轴 (Axis) 的概念,与我们日常理解的维度非常相似。

  • 直观判断: 数组的维度层数通常可以通过打印输出时中括号 [] 的嵌套层数来初步确定:
    • 一层 []一维 (1D) 数组。
    • 两层 []二维 (2D) 数组。
    • 三层 []三维 (3D) 数组,依此类推。

一、数组的创建

# 数组的简单创建
import numpy as np
a = np.array([2,4,6,8,10,12]) # 创建一个一维数组
b = np.array([[2,4,6],[8,10,12]]) # 创建一个二维数组
print(a)
print(b)

# 分清楚列表和数组的区别
print([7, 5, 3, 9])  # 输出: [7, 5, 3, 9](逗号分隔)
print(np.array([7, 5, 3, 9]))  # 输出: [7 5 3 9](空格分隔)

print(a.shape) #(6,)表示a是一个一维数组,有6个元素
print(b.shape) #(2,3)表示b是一个二维数组,有2行3列

 

二、数组的随机化创建

  1. 在后续深度学习中,我们经常需要对数据进行随机化处理,以确保模型的泛化能力。
  2. 为了测试很多函数的性能,往往需要随机化生成很多数据。
  • NumPy随机数生成方法对比
import numpy as np

# 生成一个介于 1(包含)到 10(不包含)之间的单个随机整数
single_random_int = np.random.randint(1, 10)
print("单个随机整数:", single_random_int)

# 生成一个形状为 (2, 3),元素介于 0(包含)到 5(不包含)之间的二维数组
random_array = np.random.randint(0, 5, size=(2, 3))
print("随机整数数组:\n", random_array)

# 只提供一个参数,生成一个介于 0(包含)到 5(不包含)之间的单个随机整数
single_random_int_one_param = np.random.randint(5)
print("单个随机整数(单参数):", single_random_int_one_param)


# 生成一个位于 [0, 1) 区间内的单个随机浮点数
single_random_float = np.random.rand()
print(f"单个随机浮点数:{single_random_float}")

# 生成一个包含 5 个随机浮点数的一维数组
one_dim_array = np.random.rand(5)
print(f"一维随机浮点数数组:{one_dim_array}")

# 生成一个形状为 (2, 3) 的二维随机浮点数数组
two_dim_array = np.random.rand(2, 3)
print(f"二维随机浮点数数组:\n, {two_dim_array}")

三、数组的遍历

import numpy as np
scores = np.array([5, 9, 9, 11, 11, 13, 15, 19])
scores += 1 # 在原来的scores上+1,而不是创建一个新的变量 
sum = 0
for i in scores: # 遍历数组中的每个元素
    sum += i   
print(sum)

 

四、数组的运算

  1. 矩阵乘法:需要满足第一个矩阵的列数等于第二个矩阵的行数,和线代的矩阵乘法算法相同。
  2. 矩阵点乘:需要满足两个矩阵的行数和列数相同,然后两个矩阵对应位置的元素相乘。
  3. 矩阵转置:将矩阵的行和列互换。
  4. 矩阵求逆:需要满足矩阵是方阵且行列式不为0,然后使用伴随矩阵除以行列式得到逆矩阵。
  5. 矩阵求行列式:需要满足矩阵是方阵,然后使用代数余子式展开计算行列式。
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) #数组的点乘
print(a @ b.T ) # 矩阵乘法,3*2的矩阵和2*3(b转置)的矩阵相乘,得到3*3的矩阵

四、 数组元素的访问 

假设array3d是一个三维数组,array3d.shape为(z,x,y),表示array3d有3个二维数组(3层平面),每个二维数组有x行和y列。

三维数组的访问:

1. 访问特定的层数(平面)

  • - array3d[z]:访问第z层平面(从0开始计数)(从上到下:0到n)。
  • - array3d[z,:,:]:访问第z层平面的所有行和列,与array3d[z]相同。

2. 访问特定的行和列

  • - array3d[z,x,:]:访问第z层平面的第x行的所有列。
  • - array3d[z,:,y]:访问第z层平面的所有行的第y列。
  • - array3d[z,x,y]:访问第z层平面的第x行的第y列的元素。

3. 访问特定的行和列范围

  • - array3d[z1:z2,x1:x2,y1:y2]: 访问第z1到z2层平面的第x1到x2行的第y1到y2列的元素。这里面的“a:b”也是包含a但不包含b,“a:”表示从a开始到最后,“:b”表示从开始到b,“:”表示所有。

对于一个三维数组:

  1.  先看三括号里的双括号个数确定层数(z)
  2.  再看每个双括号里的单括号个数确定每一层的行数(y)
  3.  最后看每个单括号里的元素个数确定每一层的列数(x)

五、回过头看Shap值

# --- 1. 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].shape ==(1397,30)
# X_test.shape == (1397,30)

此时可以理解为什么shap.summary_plot中第一个参数是所有样本对预测类别的shap值了。

传入的 SHAP 值 (shap_values[:, :, 0]) 和特征数据 (X_test) 在维度上需要高度一致和对应。

  • shap_values[:, :, 0] 的每一行代表的是 一个特定样本每个特征对于预测类别的贡献值(SHAP 值)。缺乏特征本身的值
  • X_test 的每一行代表的也是同一个特定样本的特征值。

这二者组合后,就可以组合(特征数,特征值,shap值)构成shap图的基本元素

@浙大疏锦行

你可能感兴趣的:(python,numpy,开发语言)