【问题标题】:Remove items from two lists based on value at index in either根据任一索引中的值从两个列表中删除项目
【发布时间】:2020-03-15 03:21:36
【问题描述】:

我需要比较两个列表,并根据任一项目的值有条件地从这两个列表中删除项目。

输入:

a = np.array( [1 , 2 , 3 , -1 , 5] )
b = np.array( [1 , -1 , 3 , 4 , 5] )

需要的输出:

a_filter = [1 , 3 , 5]
b_filter = [1 , 3 , 5]

我可以使用以下方法轻松获取出现“-1”值的列表索引数组:

np.where( ( a == -1 ) | (b == -1 ) )[0]

但是从列表 a 和 b 中删除这些索引的最有效方法是什么?我能想到的唯一方法是对已识别的索引进行反向排序,并通过两个列表删除它们,但这似乎效率很低。

列表顺序很重要,因为需要制作混淆矩阵,但不想比较 -1 结果。

【问题讨论】:

  • 考虑内置函数 zip。可能在带有条件的列表推导中。可能解压缩以获得两个过滤列表。编辑:因为它们是 numpy,所以使用 numpy 答案

标签: python pandas list numpy filtering


【解决方案1】:

既然你标记了pandas

df=pd.DataFrame([a,b]).T
s=df[~df.eq(-1).any(1)].values
a_=s[:,0]
b_=s[:,1]
a_
Out[477]: array([1, 3, 5], dtype=int64)
b_
Out[478]: array([1, 3, 5], dtype=int64)

【讨论】:

    【解决方案2】:

    IIUC,你可以使用布尔索引:

    import numpy as np
    
    a = np.array( [1 , 2 , 3 , -1 , 5] )
    b = np.array( [1 , -1 , 3 , 4 , 5] )
    
    mask = ~((a == -1) | (b == -1))
    
    a_filtered = a[mask]
    b_filtered = b[mask]
    
    print(a_filtered)
    print(b_filtered)
    

    输出

    [1 3 5]
    [1 3 5]
    

    【讨论】:

      【解决方案3】:

      您可以为此使用numpy.delete

      >>> a_filter = np.delete(a, np.where( ( a == -1 ) | (b == -1 ) )[0])
      >>> a_filter
      array([1, 3, 5])
      >>> b_filter = np.delete(b, np.where( ( a == -1 ) | (b == -1 ) )[0])
      >>> b_filter
      array([1, 3, 5])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-23
        • 1970-01-01
        • 1970-01-01
        • 2019-06-06
        • 2021-08-03
        • 1970-01-01
        • 2018-09-14
        • 1970-01-01
        相关资源
        最近更新 更多