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

Jun*_*Jun 6 python arrays numpy

我有一个包含4列和数千行的文件.我想删除第一列中的项目在特定范围内的行.例如,如果我的文件中的数据如下:

18  6.215   0.025
19  6.203   0.025
20  6.200   0.025
21  6.205   0.025
22  6.201   0.026
23  6.197   0.026
24  6.188   0.024
25  6.187   0.023
26  6.189   0.021
27  6.188   0.020
28  6.192   0.019
29  6.185   0.020
30  6.189   0.019
31  6.191   0.018
32  6.188   0.019
33  6.187   0.019
34  6.194   0.021
35  6.192   0.024
36  6.193   0.024
37  6.187   0.026
38  6.184   0.026
39  6.183   0.027
40  6.189   0.027
Run Code Online (Sandbox Code Playgroud)

我想删除第一项在20到25之间或30到35之间的行.这意味着我期望的输出是:

18  6.215   0.025
19  6.203   0.025
26  6.189   0.021
27  6.188   0.020
28  6.192   0.019
29  6.185   0.020
36  6.193   0.024
37  6.187   0.026
38  6.184   0.026
39  6.183   0.027
40  6.189   0.027
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?

Rog*_*Fan 7

如果你想继续使用numpy,解决方案并不难.

data = data[np.logical_not(np.logical_and(data[:,0] > 20, data[:,0] < 25))]
data = data[np.logical_not(np.logical_and(data[:,0] > 30, data[:,0] < 35))]
Run Code Online (Sandbox Code Playgroud)

或者如果你想将它们全部合并为一个语句,

data = data[
    np.logical_not(np.logical_or(
        np.logical_and(data[:,0] > 20, data[:,0] < 25),
        np.logical_and(data[:,0] > 30, data[:,0] < 35)
    ))
]
Run Code Online (Sandbox Code Playgroud)

为了解释,像data[:,0] < 25创建布尔数组的条件语句一样,逐个元素地跟踪数组中的条件为true或false.在这种情况下,它会告诉您第一列数据小于25的位置.

您还可以使用这些布尔数组索引numpy数组.一个语句,如data[data[:,0] > 30]提取所有行为data[:,0] > 30true,或者第一个元素大于30的所有行.这种条件索引是如何提取所需的行(或列或元素).

最后,我们需要逻辑工具来逐元素地组合布尔数组.Regular and,ornot语句不起作用,因为它们试图将布尔数组作为一个整体组合在一起.幸运的是,numpy的提供了形式使用一组这些工具np.logical_and,np.logical_ornp.logical_not.有了这些,我们可以按元素方式组合我们的布尔数组,以找到满足更复杂条件的行.

  • 或者你可以做`col0 = a [:,0]`和`a [〜((col0> = 20)&(col0 <= 25)&(col0> = 30)&(col0 <= 35))]` (2认同)

Jak*_*kob -1

您不需要为此增加 numpy 的复杂性。我猜您正在将文件读入此处的列表列表中(每行都是整个数据列表中的一个列表,如下所示: ((18, 6.215, 0.025), (19, 6.203, 0.025), . ..))。在这种情况下,请使用以下规则:

for row in data:
    if((row[0] > 20 and row[0] < 25) or (row[0] > 30 and row[0] < 35)):
        data.remove(row)
Run Code Online (Sandbox Code Playgroud)