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

  • Post category:Python

要根据多个条件从Numpy数组中删除行,可以使用以下步骤:

  1. 首先,导入numpy库:
import numpy as np
  1. 创建一个包含多个条件的布尔型索引数组。例如,我们想要从以下数组中删除所有生命值小于50或攻击力小于20的角色:
array = np.array([
    [1, 'Warrior', 80, 50],
    [2, 'Mage', 60, 80],
    [3, 'Hunter', 90, 10],
    [4, 'Paladin', 70, 30],
    [5, 'Rogue', 50, 15]
])

我们可以使用如下代码创建一个布尔型索引数组:

mask = (array[:, 2] >= 50) & (array[:, 3] >= 20)

这里,我们使用了一个逻辑与运算符(&)来链接两个条件。 ‘&’ 运算符按位进行运算,两个操作数的位中只要有一个为0,则该位的结果就是0;否则就是1。这样,就保证了组成布尔值的任一条件都要被满足时,mask数组才为True。

  1. 接下来,我们可以使用布尔型索引数组过滤原始数组。我们可以在原始数组上使用如下代码:
new_array = array[mask]

这个新的数组就是满足我们所有条件的数组了。

完整示例1:

import numpy as np

array = np.array([
    [1, 'Warrior', 80, 50],
    [2, 'Mage', 60, 80],
    [3, 'Hunter', 90, 10],
    [4, 'Paladin', 70, 30],
    [5, 'Rogue', 50, 15]
])

mask = (array[:, 2] >= 50) & (array[:, 3] >= 20)

new_array = array[mask]

print(new_array)

输出结果:

[[1 'Warrior' 80 50]
 [2 'Mage' 60 80]
 [4 'Paladin' 70 30]]

完整示例2:

另一个例子是在条件数组上使用逻辑或运算符(|)的情况。 假设我们想要从以下数组中删除所有生命值小于50并且攻击力小于20的角色以及所有生命值大于80的角色:

array = np.array([
    [1, 'Warrior', 80, 50],
    [2, 'Mage', 60, 80],
    [3, 'Hunter', 90, 10],
    [4, 'Paladin', 70, 30],
    [5, 'Rogue', 50, 15]
])

可以使用以下代码来创建一个布尔型索引数组:

mask = ((array[:, 2] >= 50) & (array[:, 3] >= 20)) | (array[:, 2] <= 80)

这里,我们使用了一个逻辑或运算符来连接两个条件。 ‘|’运算符会将两个操作数的位中任意一位上的值为1,则该位的结果就是1;否则就是0。这样就保证了 符合组成布尔值的任何一个条件就可以更新mask数组为True。

接下来,我们可以使用如下代码过滤原始数组:

new_array = array[mask]

完整示例2:

import numpy as np

array = np.array([
    [1, 'Warrior', 80, 50],
    [2, 'Mage', 60, 80],
    [3, 'Hunter', 90, 10],
    [4, 'Paladin', 70, 30],
    [5, 'Rogue', 50, 15]
])

mask = ((array[:, 2] >= 50) & (array[:, 3] >= 20)) | (array[:, 2] <= 80)

new_array = array[mask]

print(new_array)

输出结果:

[[1 'Warrior' 80 50]
 [2 'Mage' 60 80]
 [3 'Hunter' 90 10]
 [4 'Paladin' 70 30]
 [5 'Rogue' 50 15]]

总之,可以使用布尔型索引数组根据多个条件过滤Numpy数组。 此方法可以很好地扩展到更长的条件列表上,只需要添加更多的 ‘&”|’操作即可。