HOWTO · NumPy

在 NumPy 中删除行

numpy.delete() 函数可用于从 Python 中的多维 NumPy 数组中删除一行。

本页内容

NumPy 数组没有能在原地改变数组大小的删行操作。若要创建一个不含指定行的新数组,可以在 numpy.delete() 中指定行轴,也可以使用布尔掩码保留符合条件的行。数组索引从 0 开始,因此索引 1 表示第二行。

按索引使用 numpy.delete() 删除一行

将数组、行索引和 axis=0 传给 numpy.delete()。轴 0 用于选择行;对于二维数组,轴 1 用于选择列。下面的示例会删除第二行:

本节中的代码以及显示的标签或输出仍为英文。

import numpy as np

array = np.array([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]])
without_second = np.delete(array, 1, axis=0)
print(without_second)

返回的数组包含第一行和第三行。numpy.delete() 会创建一个新数组,原数组 array 保持不变。后续计算应使用返回值;像上面的示例那样将结果赋给新变量,也能保留原数组供之后使用。

按索引删除多行

要在一次调用中删除多个已知行,请将这些行的索引作为序列传入。索引始终对应原数组,因此在同一次调用中删除索引 1 不会改变索引 3 的含义。下面的示例会删除第二行和第四行:

本节中的代码以及显示的标签或输出仍为英文。

import numpy as np

array = np.array([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9],
                  [10, 11, 12]])
without_selected = np.delete(array, [1, 3], axis=0)
print(without_selected)

剩余行是原数组中索引为 0 和 2 的行。如果要删除哪些行取决于数据值,使用布尔掩码通常比先收集这些行的索引更清晰。

删除符合条件的行

布尔掩码可以用于选择要保留的行。对于二维数组,array[:, 0] 会选取第一列;将其与 5 比较,会为每一行生成一个布尔值。下面的示例会保留第一列的值大于 5 的行:

本节中的代码以及显示的标签或输出仍为英文。

import numpy as np

array = np.array([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9],
                  [10, 11, 12]])
keep = array[:, 0] > 5
filtered = array[keep]
print(filtered)

这种做法是筛选并保留符合条件的行,而不是使用 numpy.delete() 删除行。若要删除符合条件的行,可以用 ~ 反转掩码,例如 array[~keep]。请根据自己的数据选择与目标列和规则相符的比较条件。

理解轴、索引和返回的数组

对于二维数组,axis=0 表示行,axis=1 表示列。在 numpy.delete(array, index, axis=0) 中,index 是沿行轴从 0 开始的位置:0 表示第一行,1 表示第二行,以此类推。省略 axis 时,数组会先展平再执行删除,因此不会从二维数组中删除完整的一行。

该操作会返回一个新数组,而不会调整输入数组的大小。你可以将结果赋给变量以保留它,也可以直接在后续表达式中使用。超出所选轴范围的索引属于越界索引;NumPy 会报告 IndexError。如果不确定条件会选中哪些行,可以先检查布尔掩码或打印选中的行,再将结果用于更大的计算。