各种索引方法能够选择 NumPy 数组的特定元素或部分。这些强大的选择方法被用来更改数组中的值。这是在数据分析和机器学习任务中进行数据清理、转换和处理的一项基本操作。核心思想很简单:任何您用来选择数据的方法,只要在赋值运算符 (=) 的左侧使用,都可以用来为选定元素赋新值。为单个元素赋值就像您使用方括号 [] 和索引来访问元素一样,您也可以使用相同的语法来为该特定位置赋新值。对于一维数组:import numpy as np # 创建一个简单的一维数组 arr1d = np.arange(10) print("原始一维数组:", arr1d) # 输出: 原始一维数组: [0 1 2 3 4 5 6 7 8 9] # 修改索引为 5 的元素 arr1d[5] = 99 print("修改后的一维数组:", arr1d) # 输出: 修改后的一维数组: [ 0 1 2 3 4 99 6 7 8 9]对于二维数组,您使用 [行, 列] 记法:# 创建一个二维数组 arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print("原始二维数组:\n", arr2d) # 输出: # 原始二维数组: # [[1 2 3] # [4 5 6] # [7 8 9]] # 修改第 1 行、第 2 列的元素 arr2d[1, 2] = -5 print("修改后的二维数组:\n", arr2d) # 输出: # 修改后的二维数组: # [[ 1 2 3] # [ 4 5 -5] # [ 7 8 9]]修改数组切片切片允许您选择一系列元素。您可以为整个切片赋一个单一值,或者赋一个与切片形状匹配的数组值。为切片赋标量值:当您为切片赋一个单一标量值(例如一个数字)时,NumPy 会使用广播机制,用该值填充整个选定的切片。# 重新创建一维数组 arr1d = np.arange(10) print("原始一维数组:", arr1d) # 输出: 原始一维数组: [0 1 2 3 4 5 6 7 8 9] # 将值 100 赋给从索引 2 开始(不包括 5)的元素 arr1d[2:5] = 100 print("修改后的切片(标量):", arr1d) # 输出: 修改后的切片(标量): [ 0 1 100 100 100 5 6 7 8 9]对于二维数组,这同样适用:# 重新创建二维数组 arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print("原始二维数组:\n", arr2d) # 输出: # 原始二维数组: # [[1 2 3] # [4 5 6] # [7 8 9]] # 将 0 赋给左上角的 2x2 子数组 arr2d[0:2, 0:2] = 0 print("修改后的切片(标量,二维):\n", arr2d) # 输出: # 修改后的切片(标量,二维): # [[0 0 3] # [0 0 6] # [7 8 9]]为切片赋数组:您也可以将另一个数组(或列表)赋给切片,前提是您要赋的数组的形状与您选择的切片的形状匹配。# 重新创建一维数组 arr1d = np.arange(10) print("原始一维数组:", arr1d) # 输出: 原始一维数组: [0 1 2 3 4 5 6 7 8 9] # 将列表中的值赋给切片 arr1d[5:8] = [55, 66, 77] print("修改后的切片(数组):", arr1d) # 输出: 修改后的切片(数组): [ 0 1 2 3 4 55 66 77 8 9] # 尝试赋值一个形状不匹配的数组会导致错误 # arr1d[5:8] = [1, 2] # 这将引发 ValueError关于切片与视图的重要提示: 当您修改一个切片时,通常是直接修改原始数组。这是因为切片通常返回原始数据的视图,而不是副本。请注意这一点,因为通过切片视图所做的更改会反映在原始数组中。arr = np.arange(5) print("原始数组:", arr) # [0 1 2 3 4] arr_slice = arr[1:4] print("切片:", arr_slice) # [1 2 3] arr_slice[:] = 99 # 修改切片的所有元素 print("修改后的切片:", arr_slice) # [99 99 99] print("切片修改后的原始数组:", arr) # [ 0 99 99 99 4]请注意,修改 arr_slice 也改变了 arr。使用布尔索引进行修改布尔索引对于更改满足特定条件的元素非常有用。您将布尔条件放在方括号内。所有条件评估为 True 的元素都将被选中进行赋值。# 创建一个包含正数和负数的数组 data = np.array([-1, 5, -3, 0, 8, -2, 4]) print("原始数据:", data) # 输出: 原始数据: [-1 5 -3 0 8 -2 4] # 将所有负数赋为 0 data[data < 0] = 0 print("替换负数后的数据:", data) # 输出: 替换负数后的数据: [0 5 0 0 8 0 4] # 为满足另一个条件的元素赋特定值 data[data > 5] = 500 print("将大于 5 的值设限后的数据:", data) # 输出: 将大于 5 的值设限后的数据: [ 0 5 0 0 500 0 4]同样,广播机制也适用。当您赋一个单一标量值(如上面的 0 或 500)时,它会被赋给所有通过布尔条件选中的元素。使用高级索引进行修改高级索引使用整数数组来指定您要访问或修改的元素的索引。这使得选择和更改非连续元素成为可能。# 创建一个一维数组 arr = np.zeros(10, dtype=int) # 包含十个零的数组 print("初始数组:", arr) # 输出: 初始数组: [0 0 0 0 0 0 0 0 0 0] # 使用高级索引设置特定元素 indices_to_change = [1, 4, 7, 8] arr[indices_to_change] = 99 print("高级索引赋值后的数组:", arr) # 输出: 高级索引赋值后的数组: [ 0 99 0 0 99 0 0 99 99 0] # 您也可以赋值一个与索引数量匹配的序列 new_values = [11, 44, 77, 88] arr[indices_to_change] = new_values print("赋值序列后的数组:", arr) # 输出: 赋值序列后的数组: [ 0 11 0 0 44 0 0 77 88 0]高级索引也可以用于多维数组:# 创建一个二维数组 arr2d = np.arange(12).reshape((3, 4)) print("原始二维数组:\n", arr2d) # 输出: # 原始二维数组: # [[ 0 1 2 3] # [ 4 5 6 7] # [ 8 9 10 11]] # 使用行和列索引数组选择特定元素 rows = np.array([0, 1, 2]) cols = np.array([1, 2, 0]) # 选择元素 (0,1), (1,2), (2,0) # 为选定的元素赋值 arr2d[rows, cols] = -1 print("修改后的二维数组(高级索引):\n", arr2d) # 输出: # 修改后的二维数组(高级索引): # [[ 0 -1 2 3] # [ 4 5 -1 7] # [-1 9 10 11]]主要内容是,相同的灵活选择机制对于赋值操作同样有效。能够使用索引、切片、布尔条件或索引数组选择数据的子集,然后直接修改这些子集,是 NumPy 中数据操作的根本。在为数据分析或机器学习模型准备数据时,您会经常使用这些技巧。