今日任务:
- numpy数组的创建:简单创建、随机创建、遍历、运算
- numpy数组的索引:一维、二维、三维
- SHAP值的深入理解
数组的创建
数据的维度
在numpy数组中,数组的维度(dimension),可以通过打印输出中的中括号‘[]’的嵌套层数进行判断(l,m,n,...):
- 一维:形如[7 5 5 9],可以看到与列表相似但不同,数组内元素以空格分隔,而列表则为逗号
- 二维:可以看作矩阵(n*m),其中n为行数,m为列数
- 三维:含有三层 [ ]
- 多维:含有多层 [ ]
创建数组
普通
可以使用numpy中的array()函数进行数组的创建:
- 将一个序列(如列表、元组等)或类似数组的数据结构转换为一个 NumPy 数组(ndarray 对象)
- 常用的参数有object(要转换的数据),dtype(数据类型,int/float)
import numpy as np
A = np.array([1,2,3]) #[1 2 3] #一维数组
B = np.array([[1,2,3],[4,5,6]]) #[[1 2 3][4 5 6]],二维数组
C = np.array((4,5,6)) #[4 5 6]
特殊数组
此外,还有特定的函数进行特殊数组的生成(举例):
- np.zeros():创建全零数组。必选参数shape,定义数组的维度;dtype等;
np.zeros_like():创建与给定数组形状和数据类型相同的零数组。- np.ones():创建全1数组。必选参数shape,定义数组的维度;dtype等
np.full():创建所有元素为指定值的数组。- np.arange([start, ]stop, [step, ],dtype=None):生成顺序数组。类似range函数(不包含结束值),但返回的是numpy数组
- np.linspace(start,stop,number):在某区间内生成指定元素数量的数组,包含结束值
a = np.ones((3,2),dtype=int)
b = np.zeros((4,)) #[0. 0. 0. 0.]
c = np.arange(1,8,2) #[1 3 5 7]
d = np.linspace(0,2,5) #[0. 0.5 1. 1.5 2. ]
随机化
通过对数据的随机化处理,可以确保模型的泛化能力。

import random
a = np.random.randint(1,6) #随机生成整数
b = np.random.rand(4,2) #返回指定维度的浮点数数组,范围在[0, 1) 之间
c = np.random.randn(3,2) #返回3行2列的数组(标准正态分布)
d = random.random() #返回[0,1)间的浮点数
例子(数组的随机化):
import numpy as np
#设置随机种子让结果复现
np.random.seed(42)
chinese_grades = 75+10*np.random.randn(10) #标准正态分布转换为一般正态分布
#chinese_grades = np.random.normal(75,10,10).round(1)
for i in chinese_grades:
print(f'Grades:{i:.1f}') #打印每个成绩(保留1位小数)
#打印最高成绩及对应索引,argmax()
print('Best Grades:{:.1f}, Index:{}'.format(chinese_grades.max(),chinese_grades.argmax()))
#打印最低成绩及对应索引,argmin()
print('Lowest Grades:{:.1f},Index:{}'.format(chinese_grades.min(),chinese_grades.argmin()))
实际上,还可以使用np.random.normal(均值,方差,形状)来生成正态分布的数据。指定保留小数位数时,可以使用round(n)函数保留n位小数。
遍历
a = np.array([5, 9, 9, 11, 11, 13, 15, 19])
a += 1 #每个元素少加1
sum = 0
for i in a:
sum += i #计算总和
print(f"总和:{sum}")
运算
对于数组的运算,这里主要学习矩阵(二维数组)的常见运算:
- 乘法:运算方法与线性代数中的矩阵乘法相同,即m*n与 n*l进行运算得到m*l。a@b
- 点乘:两矩阵大小相同(均为m*n型),矩阵中对应位置的元素相乘 a*b
- 转置:矩阵的行列互换 np.transpose() 或 a.T
- 求逆:线代中的求逆。矩阵是方阵且行列式不为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与b的和:{}'.format(a+b))
print('a与b的差:{}'.format(a-b))
print('a与b的商:{}'.format(a/b))
#点乘
print('a和b的点乘:{}'.format(a*b))
#a和b转置的矩阵乘法
print('a和b转置的矩阵乘法:{}'.format(a @ b.T))
数组的索引
对于一维数组来说,使用索引和切片的操作基本与列表相同。但不同的是,数组可以使用整数数组进行索引,可以一次性取出多个元素(与切片的取法不同)。语法是 arr1d[[index1, index2, ...]]。
import numpy as np
arr1d = np.arange(10) #array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr1d[[3,5,8]] #array([3, 5, 8])
对于二维数组来说,arr2d[i, j]中,i为行索引,j为列索引。对于每一个索引的使用方法与一维数组的使用方法相同。
- arr2d[1, :]或arr2d[1]:取出第 2 行 (索引为 1) 的所有元素。
- arr2d[:, 2]:取出第 3 列 (索引为 2) 的所有元素
- arr2d[2, 3]:取出位于第 2 行 (索引 2)、第 3 列 (索引 3) 的元素。
- arr2d[:, [1, 3]]:取出由第 1 列和第 3 列组成的新数组。
- arr2d[1:3, 1:3]:取出一个 2x2 的子矩阵
而对于三维数组,基本使用方法与二维数组类似,区别就是增加了一个维度。
Shap值的深入理解
在day14的学习中,在计算shap值的过程中接触了数组:
- shap_values:三维数组形式,(样本数,特征数,类别数)
- shap_values[0,:,:]:第一个样本中的每个特征对2个目标类别的shap值贡献
- shap_values[:,:,0]:所有样本中的每个特征对第一个类别的shap值贡献
shap.summary_plot(shap_values[:, :, 0], X_test,plot_type="violin",show=False,max_display=10) # 这里的show=False表示不直接显示图形,这样可以继续用plt来修改元素,不然就直接输出了
plt.title("SHAP Feature Importance (Violin Plot)")
plt.show()
在绘制summary_plot时的第一个参数是所有样本对类别的shap值,同时shap_values[:,:,0]和X_test的维度相同:
- shap_values[:,:,0]中每一行都是一个样本中每个特征对于预测类别的贡献值,但是缺乏特征本身的值
- 而X_test的每一行是同一个样本的特征值(补足了特征值的缺失)
- 将二者结合,就得到了特征数量,特征值,shap值这些构成shap图的基本元素
6736

被折叠的 条评论
为什么被折叠?



