趋近智
各种索引方法能够选择 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 中数据操作的根本。在为数据分析或机器学习模型准备数据时,您会经常使用这些技巧。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造