本文默认读者具备以下技能:
- 熟悉python基础知识,vscode或其它编辑工具
- 熟悉表格文件的基本操作
- 具备自主扩展学习能力
本文通过一个实例,概述了一系列NumPy基础操作,所涉及的操作均为常见操作,更多的知识点参见官方文档https://www.numpy.org.cn/
本文知识点包括:
- 读取CSV文件(使用
loadtxt
函数从CSV文件中读取数据,并将缺失值填充为NaN,为后续处理做准备) - 切片与索引(通过切片与索引操作,可以方便地提取NumPy数组中的特定元素或子集)
- 赋值(赋值操作允许我们直接修改NumPy数组中的元素值,实现数据的更新或替换)
- 布尔索引(布尔索引通过条件表达式筛选数组中的元素,帮助我们快速获取满足特定条件的数据)
- 三元运算符(
np.where
函数实现三元运算符的功能,根据条件将数组中的元素替换为不同的值) - 裁剪(裁剪操作将数组中的值限制在指定范围内,超出范围的值将被截断或保持为NaN)
- 转置(转置操作改变数组的行和列,实现数据的行列交换,常用于矩阵运算和数据处理)
- 数组拼接(数组拼接将多个NumPy数组按照指定轴连接在一起,形成更大的数组结构)
- NaN值的处理(Not a number的缩写,NaN值需要特殊处理。使用NumPy的函数可以方便地计算排除NaN值的统计量,如均值)
本例采用的二维数组(或称为矩阵)的形式来解释NumPy的基础操作。二维数组实际就是我们最常用的含有行列的表格数据。
二维数组是一个由行和列组成的矩形网格,其中每个元素都可以通过其行索引和列索引来定位。在NumPy中,二维数组通常被用来表示具有行和列的数据集,例如电子表格中的数据。
例如,如果我们有一个包含学生成绩的数据集,每个学生有多门课程的成绩,我们可以将这些数据存储在一个二维数组中。每一行代表一个学生,每一列代表一门课程。通过行索引和列索引,我们可以方便地访问、修改或计算每个学生的成绩。
本例正是基于最常见的二维数据的实例操作,完整代码如下:
import numpy as np
'''
假设我们有一个包含NaN值(即空白字符)的CSV文件
example.csv的内容如下:
1,2,
4,,6
7,8,9
在这个文件中第一行,第二行分别有一个空白字符,读取时将处理为NaN值
'''
# 使用NumPy的loadtxt函数读取CSV文件,并指定缺失值的占位符
# 在这个例子中,我们假设空字符串("")表示NaN
data = np.loadtxt('example.csv', delimiter=',', dtype=float, skiprows=1, usecols=(0, 1, 2), filling_values=np.nan)
# 打印读取的数据
print("读取的CSV数据:")
print(data)
# 切片与索引
print("\n切片与索引:")
print(data[:, 1]) # 获取第二列
print(data[1:3, 0:2]) # 获取第二行到第三行(不包括第三行),以及第一列到第二列(不包括第二列)的子数组
# 赋值
print("\n赋值:")
data[0, 2] = 3 # 将第一行第三列的NaN值替换为3
print(data)
# 布尔索引
print("\n布尔索引:")
condition = ~np.isnan(data) # 创建一个非NaN的布尔数组
print(data[condition]) # 获取所有非NaN的元素
# 三元运算符(np.where)
print("\n三元运算符:")
data_new = np.where(np.isnan(data), 0, data) # 将NaN值替换为0,其他值保持不变
print(data_new)
# 裁剪
print("\n裁剪:")
clipped_data = np.clip(data, 1, 8) # 将数组中的值裁剪到1和8之间,NaN值保持不变
print(clipped_data)
# 转置
print("\n转置:")
transposed_data = data.T # 转置数组
print(transposed_data)
# 数组拼接
print("\n数组拼接:")
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6]])
# 沿着第一轴(行)拼接
arr_stacked = np.vstack((arr1, arr2))
print(arr_stacked)
# 沿着第二轴(列)拼接
arr_hstacked = np.hstack((arr1, arr2.T)) # 注意:需要转置arr2以匹配列数
print(arr_hstacked)
# 处理NaN值 - 计算非NaN值的均值
print("\n处理NaN值:")
mean_value = np.nanmean(data) # 计算数组中所有非NaN值的均值
print("Mean excluding NaN values:", mean_value)
在这个脚本中,我们首先使用np.loadtxt
函数读取CSV文件,并指定了缺失值的占位符为NaN(filling_values=np.nan
)。然后,我们按照之前的例子展示了NumPy的基础操作,包括切片与索引、赋值、布尔索引、三元运算符、裁剪、转置和拼接数组。最后,我们使用np.nanmean
函数计算了数组中所有非NaN值的均值。