【问题标题】:Deleting rows in np array inside a for loop在for循环内删除np数组中的行
【发布时间】:2018-11-02 09:49:41
【问题描述】:

我正在尝试删除列表“a”中包含的多个二维数组中包含一个或多个非零元素的所有行。

当我在“i”循环之外运行它时,此方法有效,但作为一个整体无效。我知道我不能删除我正在迭代的行,但我相信在这种情况下我不会这样做,因为我只删除 a 中包含的数组中的行,而不是数组本身。

for i in range(len(a)):
  del_idx=[]
  for j in range(len(a[i])):
    nonzero=np.nonzero(a[i][j])
    nonzero_len=len(nonzero[0]) #because np.nonzero outputs a tuple
    if nonzero_len<=1:
        del_idx.append(j)
    else:
        continue
  np.delete(a[i],(del_idx),axis=0)

有人知道这里发生了什么吗?如果这真的不起作用,我怎样才能在不使用循环的情况下删除这些元素?这是 Python 2.7

谢谢!

【问题讨论】:

    标签: python arrays numpy rowdeleting


    【解决方案1】:

    当矢量化操作可用时,您应该避免使用 NumPy 出现 for 循环。例如,在这里,您可以使用布尔索引:

    import numpy as np
    
    np.random.seed(0)
    
    A = np.random.randint(0, 2, (10, 3))
    
    res = A[(A != 0).sum(1) > 1]
    
    array([[0, 1, 1],
           [0, 1, 1],
           [1, 1, 1],
           [1, 1, 0],
           [1, 1, 0],
           [0, 1, 1],
           [1, 1, 0]])
    

    可以对数组列表中的每个数组应用相同的逻辑。

    【讨论】:

    • 效果很好,谢谢。你将如何在“0”轴上做同样的事情?将 .sum(1) 更改为 .sum(0) 会引发“布尔索引与维度 0 的索引数组不匹配;维度为 10 但相应的布尔维度为 3”
    • @AlexisBL, A[:, (A != 0).sum(0) &gt; 1]
    【解决方案2】:

    您可以使用np.where() 进行索引:

    a = np.random.randint(0, 2, size=(10,10))
    # array([[1, 1, 0, 0, 0, 0, 0, 1, 1, 1],
    #    [1, 0, 0, 0, 1, 1, 1, 1, 0, 1],
    #    [1, 0, 1, 0, 0, 1, 0, 0, 0, 1],
    #    [1, 0, 0, 1, 0, 1, 0, 1, 1, 0],
    #    [1, 0, 0, 0, 1, 0, 1, 1, 0, 1],
    #    [0, 0, 1, 1, 1, 0, 1, 0, 0, 0],
    #    [1, 0, 0, 1, 1, 0, 0, 1, 1, 0],
    #    [0, 0, 0, 1, 0, 1, 0, 1, 1, 1],
    #    [0, 0, 1, 1, 0, 0, 1, 0, 1, 0],
    #    [1, 1, 0, 0, 0, 1, 0, 0, 1, 1]])
    
    np.where(np.count_nonzero(a, axis=1)<5)    # In your case, should be > 1
    # (array([2, 5, 8]),)
    
    a[np.where(np.count_nonzero(a, axis=1)<5)] # Returns the array you wanted
    # array([[1, 0, 1, 0, 0, 1, 0, 0, 0, 1],
    #    [0, 0, 1, 1, 1, 0, 1, 0, 0, 0],
    #    [0, 0, 1, 1, 0, 0, 1, 0, 1, 0]])
    

    【讨论】:

      猜你喜欢
      • 2020-04-04
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 2022-10-20
      • 1970-01-01
      • 2021-03-03
      • 2021-06-02
      • 1970-01-01
      相关资源
      最近更新 更多