DAY 16 Numpy 数组的常见操作及形状

@浙大疏锦行

今日任务:

  1. numpy数组的创建:简单创建、随机创建、遍历、运算
  2. numpy数组的索引:一维、二维、三维
  3. 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图的基本元素
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值