【问题标题】:Filter array by value in last column [duplicate]按最后一列中的值过滤数组[重复]
【发布时间】:2021-04-20 15:21:07
【问题描述】:

我有这样的矩阵:

m1 = 
[1, 3, 4, 2, 1, 1]
[1, 3, 5, 3, 3, 1]
[1, 2, 3, 1, 1, 0]
[1, 3, 7, 3, 1, 1]

我需要过滤它以在最后一列中获取值 1。所以结果应该是这样的:

filter_array = 
[1, 3, 4, 2, 1, 1]
[1, 3, 5, 3, 3, 1]
[1, 3, 7, 3, 1, 1]

我当前的代码是:

m1 = np.array  ##see array above
filter_array = [ ]  ## the filtered array will be stored here. raw by raw 
for raw in m1: 
    if raw[-1] ==1:
        filter_array = filter_array.append(raw[:])

我的代码返回了一个空数组。我一定错过了什么……

【问题讨论】:

    标签: python arrays numpy array-filter


    【解决方案1】:

    只需这样做:

    filtered = m1[m1[:, -1] == 1]
    

    注意:您的原始代码不起作用,因为您将append() 方法的返回值分配给filter_array。由于追加到列表成功时的返回值为None,因此在将其重新分配给None 后,您将丢失原始列表。 要使您的代码正常工作,只需执行filter_array.append(row[:]),因为这会使列表发生变化。只需附加 row 也可以。

    【讨论】:

    • 除了展示更好的方法之外,如果您解释为什么原始代码不起作用,这将有所帮助。
    • @Barmar:感谢您指出。用解释更新了我的答案。
    【解决方案2】:

    filter_array.append(raw[:]) 不返回任何内容。它的NoneType。 所以你不能在循环中第二次执行 NoneType 对象时追加行。

    您更正的循环应该是:

    filter_array = []
    for raw in m1: 
        if raw[-1] ==1:
            filter_array.append(raw[:])
    print(filter_array)
    

    或者更好的是,您可以使用如下的列表理解和布尔索引:

     filter_array = m1[[True if arr[-1] == 1 else False for arr in m1]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-16
      • 2015-02-20
      • 2016-12-22
      • 2011-11-14
      • 2021-09-09
      • 2022-10-18
      • 2013-07-01
      • 2022-01-16
      相关资源
      最近更新 更多