【问题标题】:How do I remove rows in a list containing numpy arrays based on a condition?如何根据条件删除包含 numpy 数组的列表中的行?
【发布时间】:2020-11-27 21:24:43
【问题描述】:

我有以下 numpy 数组 arr_split:

import numpy as np

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

arr_split = np.array_split(arr1,
                           indices_or_sections = 4,
                           axis = 0)

arr_split

输出:

[array([[1., 2., 3.]]),
 array([[4., 5., 6.]]),
 array([[7., 8., 9.]]),
 array([], shape=(0, 3), dtype=float64)]

如何删除“空”行(例如,在上面,它是最后一行)。数组arr_split 可以有任意数量的“空”行。以上例如。恰好只有一行“空”。

我尝试过使用列表理解,如下所示:

arr_split[[(arr_split[i].shape[0] != 0) for i in range(len(arr_split))]]

但这不起作用,因为列表理解 [(arr_split[i].shape[0] != 0) for i in range(len(arr_split))] 部分返回一个列表,而我实际上只需要将列表中的元素作为索引输入 arr_split[]

有人知道我该如何解决这个问题,或者有其他方法吗?如果可能,请寻找最简单的方法来执行此操作,而无需太多循环或 if 语句。

【问题讨论】:

    标签: python list numpy list-comprehension


    【解决方案1】:

    您可以将indices_or_sections 值更改为第一个轴的长度,这将防止生成任何空数组

    import numpy as np
    
    arr1 = np.array([[1.,2,3], [4,5,6], [7,8,9]])
    
    arr_split = np.array_split(arr1,
                               indices_or_sections = arr1.shape[0],
                               axis = 0)
    
    arr_split
    
    >>> [
        array([[1., 2., 3.]]),
        array([[4., 5., 6.]]),
        array([[7., 8., 9.]])
    ]
    

    【讨论】:

    • 谢谢@Hammad。这不太适合我想做的事情,因为indices_or_sections 是我算法中用户指定的值,所以我希望它灵活。我给出的上述示例只是一个最小的工作示例。
    • @Leockl 尝试用min( user_val, arr1.shape[0]) 替换它,这样指定的索引不会超过元素的数量
    【解决方案2】:

    只需循环并检查大小。仅当它们的大小大于 0 时才将它们添加到新列表中。

    arr_split_new = [arr for arr in arr_split if arr.size > 0]
    

    【讨论】:

      【解决方案3】:

      您可以使用 enumerate 来获取索引和大小以检查是否为空

      indexes = [idx for idx, v in enumerate(arr_split) if v.size != 0]

      [0, 1, 2]

      【讨论】:

      • 谢谢,但这不起作用,因为返回的索引在列表中
      猜你喜欢
      • 1970-01-01
      • 2018-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      相关资源
      最近更新 更多