【问题标题】:Subset a np.matrix efficiently based on boolean np.array but only until certain treshold基于布尔 np.array 有效地对 np.matrix 进行子集,但仅在某个阈值之前
【发布时间】:2020-07-17 10:21:50
【问题描述】:

假设我们有一个矩阵 M

M=np.array([[1,2,3],
            [1,2,3],
            [1,2,3],
            [1,2,3]
            [1,2,3],
            [1,2,3]])

行数与 np.array 掩码的长度相同:

mask = np.array([False,True,False,True,False,True])

还有一个叫做 threshold=2 的附加参数

我只想用掩码对 M 进行子集化,直到 2 个 True 值为止,对于所有剩余的值,我将设置为 false。 这意味着 M[mask] 应该只返回第二行和第四行而不是最后一行。有没有一种有效的方法可以通过 numpy 避免 for 循环来做到这一点?

【问题讨论】:

  • 您有基于循环的工作解决方案吗?
  • 我的意思是非常简单,只是在循环检查数组中的 True 时,当阈值为 0 时,您将掩码的其余部分设置为 False。
  • 只需使用mask 链接布尔索引,然后切片。检查 numpy numpy.org/doc/stable/reference/arrays.indexing.html 中有关索引的文档

标签: python numpy numpy-ndarray


【解决方案1】:

M[mask][:2]

这会根据掩码选择您的行,并在达到 2 个 True 值后停止。

【讨论】:

    【解决方案2】:

    你可以走两条路:

    import numpy as np
    
    M = np.array([[1,2,3],
                  [1,2,3],
                  [1,2,3],
                  [1,2,3],
                  [1,2,3],
                  [1,2,3]])
    
    mask = np.array([False,True,False,True,False,True])
    
    true_locs = np.where(mask)[0]
    
    # set True to False in the mask
    mask[true_locs[2:]] = False
    
    # OR just use the indeces directly
    M[true_locs[:2],:]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 2013-05-31
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多