【问题标题】:Slicing a 2D NumPy Array by all zero rows按所有零行切片 2D NumPy 数组
【发布时间】:2020-07-28 15:04:48
【问题描述】:

这本质上是二维数组,相当于在存储特定值的索引处将 python 列表分割成更小的列表。我正在运行一个程序,该程序从 CSV 文件中提取大量数据并将其复制到 2D NumPy 数组中。这些数组的基本格式是这样的:

[[0 8 9 10]
[9 9 1 4]
[0 0 0 0]
[1 2 1 4]
[0 0 0 0]
[1 1 1 2]
[39 23 10 1]]

我想将我的 NumPy 数组沿包含所有零值的行分开,以创建一组较小的二维数组。上述起始数组的成功结果将是数组:

[[0 8 9 10]
[9 9 1 4]]

[[1 2 1 4]]

[[1 1 1 2]
[39 23 10 1]]

我考虑过简单地向下迭代数组并检查该行是否全为零,但我正在处理的数据非常大。我在文本文件中可能有数百万行数据,我试图找到最有效的方法,而不是可能浪费计算时间的循环。你对我应该做什么有什么想法?有没有更好的办法?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    a 是你的数组。您可以使用any 查找所有零行,删除它们,然后使用split 按它们的索引拆分:

    #not_all_zero rows indices
    idx = np.flatnonzero(a.any(1))
    #all_zero rows indices
    idx_zero = np.delete(np.arange(a.shape[0]),idx)
    #select not_all_zero rows and split by all_zero row indices
    output = np.split(a[idx],idx_zero-np.arange(idx_zero.size))
    

    输出:

    [array([[ 0,  8,  9, 10],
           [ 9,  9,  1,  4]]), 
     
     array([[1, 2, 1, 4]]), 
     
     array([[ 1,  1,  1,  2],
           [39, 23, 10,  1]])]
    

    【讨论】:

      【解决方案2】:

      您可以使用np.all 函数检查全为零的行,然后进行适当的索引。

      # assume `x` is your data
      indices = np.all(x == 0, axis=1)
      zeros = x[indices]
      nonzeros = x[np.logical_not(indices)]
      

      all 函数接受一个 axis 参数(与许多 NumPy 函数一样),它指示操作所沿的轴。 1这里的意思是沿行做reduction,所以你得到一个形状为(x.shape[0],)的布尔数组,可以用来直接索引x

      请注意,这将比在行上的 for 循环快很多,尤其是对于大型数组。

      【讨论】:

      • 这不提供 OP 提到的所需输出。
      猜你喜欢
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多