HOWTO · NumPy
从 NumPy 中的数组中删除元素
了解如何在 Python 中从 NumPy 数组中删除一组数字
本页内容
知道要删除哪些位置时,使用 numpy.delete();知道要排除哪些值时,使用 numpy.setdiff1d()。当某个值出现多次时,这一区别尤其重要:删除一个位置可以保留该值在其他位置的出现,而集合差运算会返回唯一值。
按索引删除元素:使用 numpy.delete()
numpy.delete(arr, obj, axis=None) 会返回一个删除了所选位置的新数组,不会就地修改 arr。obj 可以是整数位置、位置序列或切片。位置从零开始计数,因此位置 3 对应第四个元素。省略 axis 或将其设为 None 时,NumPy 会先展平输入,再删除相应位置。指定轴后,位置便对应于该轴:对于二维数组,轴 0 选择行,轴 1 选择列。
下面的完整示例会从一维数组中删除位置 3、5 和 7。代码与示例输出按英文原样保留,可直接运行:
本节中的代码以及显示的标签或输出仍为英文。
import numpy as np
values = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
positions = [3, 5, 7]
remaining = np.delete(values, positions)
print(remaining)
[ 1 2 3 5 7 9 10]
对于矩阵,axis=1 会从每一行中删除指定位置上的列。若改用 axis=None,结果会先展平为一维数组,因此这些位置将按展平后的序列计数。代码与示例输出按英文原样保留。
import numpy as np
matrix = np.array([[1, 2, 3, 4, 5], [11, 12, 13, 14, 15], [21, 22, 23, 24, 25]])
without_columns = np.delete(matrix, [1, 2], axis=1)
flattened_without_positions = np.delete(matrix, [1, 2], axis=None)
print(without_columns)
print(flattened_without_positions)
按列删除后的结果为 3 × 3;展平后的结果是一维数组,包含 13 个值。示例输出按英文原样保留:
[[ 1 4 5]
[11 14 15]
[21 24 25]]
[ 1 4 5 11 12 13 14 15 21 22 23 24 25]
位置超出范围时会引发 IndexError。例如,长度为 10 的数组中不存在位置 34。如果想显示简短的诊断信息,而不是完整的回溯,可以捕获此错误。示例中的诊断文字按英文原样保留:
import numpy as np
values = np.arange(10)
try:
np.delete(values, [34])
except IndexError as error:
print(f"Cannot delete position 34: {error}")
Cannot delete position 34: index 34 is out of bounds for axis 0 with size 10
如需了解完整的参数详情,请参阅 numpy.delete() 参考文档。
按值删除元素:使用 numpy.setdiff1d()
使用 numpy.setdiff1d(ar1, ar2),可返回存在于 ar1 但不在 ar2 中的唯一值。这里的 ar2 包含要排除的值,而不是 ar1 中的位置。默认情况下,assume_unique=False;只有在两个输入数组都已不含重复值时,才将它设为 True。这是由调用者提供的前提,因此输入数组含有重复值时不要启用此选项。
下面的示例也说明了为什么此函数不能替代按位置删除:输入中有重复的 2,但集合差结果中的每个剩余值只出现一次。示例代码和输出按英文原样保留。
本节中的代码以及显示的标签或输出仍为英文。
import numpy as np
values = np.array([4, 2, 4, 1, 2, 3])
excluded_values = np.array([4])
remaining = np.setdiff1d(values, excluded_values)
print(remaining)
[1 2 3]
setdiff1d 会生成排序后的唯一值,因此结果的重复值行为和顺序都可能与原数组不同。如果需要保留顺序和各个元素的出现次数,请改用 numpy.delete() 按位置选择。请参阅 numpy.setdiff1d() 参考文档,了解其 assume_unique 参数和返回行为。
如何选择按索引删除还是按值删除
当要删除的元素由其位置确定时,使用 numpy.delete()。它会保留位于其他位置的相同值,并允许指定轴或展平数组。当第二个数组中的值决定要排除哪些内容,且可以接受排序后的唯一值时,使用 numpy.setdiff1d()。使用它之前,请考虑重复值和顺序;使用 numpy.delete() 之前,请确认位置对应预期的轴且没有超出范围。这两个函数都不会就地修改原数组;如果要保留结果,请将返回的数组赋给变量。