如何根据多个条件从Numpy数组中删除行

  • Post category:Python

下面是如何根据多个条件从Numpy数组中删除行的详细攻略:

1. 确定要删除的多个条件

首先,我们需要确定要删除的多个条件是什么。通常来说,这些条件都是一些关于数组中元素的判断条件。比如,我们要从一个Numpy数组中删除所有生命值(第一列)小于50,并且速度(第二列)小于10的角色。那么,这个判断条件就可以表示为:

conditions = (arr[:, 0] < 50) & (arr[:, 1] < 10)

其中,arr是我们要删除行的Numpy数组,[:, 0]表示选取所有行中的第一列,[:, 1]表示选取所有行中的第二列,&表示逻辑“与”。

2. 利用条件生成布尔索引

有了要删除的多个条件之后,我们就可以利用这些条件来生成一个布尔索引。具体地,我们可以通过numpy.ones函数生成一个全为True的布尔数组,然后根据条件数组将满足条件的位置变为False

mask = np.ones(len(arr), dtype=bool)
mask[conditions] = False

这样,我们就得到了一个与arr大小相同的布尔数组mask,其中满足条件conditions的位置上的值为False,否则为True

3. 利用布尔索引删除行

最后,我们可以根据生成的布尔索引mask来删除数组中对应位置上的行:

new_arr = arr[mask]

这样,我们就成功地从arr中删除了所有满足条件conditions的行。

示例说明

假设我们有以下Numpy数组arr

arr = np.array([[80, 5, 3],
                [60, 7, 8],
                [30, 2, 9],
                [40, 8, 2],
                [10, 1, 6],
                [70, 4, 5]])

我们要从arr中删除所有生命值(第一列)小于50,并且速度(第二列)小于10的角色。那么,我们可以先根据上面的步骤生成布尔索引mask

conditions = (arr[:, 0] < 50) & (arr[:, 1] < 10)
mask = np.ones(len(arr), dtype=bool)
mask[conditions] = False

此时,mask的值为:

[False, False, False,  True,  True, False]

接下来,我们可以根据mask删除对应的行:

new_arr = arr[mask]

得到的new_arr为:

array([[80,  5,  3],
       [60,  7,  8],
       [70,  4,  5]])

可以看到,满足条件的两行已经成功地被删除了。

另外一个示例是,假设我们要从以下Numpy数组arr中删除所有行中值为3或6的元素:

arr = np.array([[5, 2, 3, 1],
                [7, 6, 4, 2],
                [2, 8, 5, 6],
                [9, 3, 1, 5],
                [4, 6, 8, 7]])

那么,我们可以根据以下步骤完成操作。首先,生成满足条件的布尔数组conditions

conditions = (arr == 3) | (arr == 6)

然后,生成对应的布尔索引mask

mask = np.ones(arr.shape[0], dtype=bool)
for c in conditions:
    mask &= ~c.any(axis=1)

最后,根据mask删除对应的行:

new_arr = arr[mask]

得到的new_arr为:

array([[5, 2, 1],
       [7, 4, 2],
       [2, 8, 5],
       [9, 1, 5],
       [4, 8, 7]])

可以看到,所有满足条件的元素都已经被成功删除了。