【问题标题】:Get the indices of min values for each row in a 2D np.array, if the min value satisfies a condition如果最小值满足条件,则获取 2D np.array 中每一行的最小值索引
【发布时间】:2019-03-05 16:02:11
【问题描述】:

我有一个二维np.array,尺寸为1000 (rows) x 12 (columns)

我需要获取那些低于1.5 的值的索引。
如果一行包含多个满足此条件的值,那么我只需要保留最低的索引。

我很乐意使用 idx1,idx2=np.where(x < 1.5), 但这有时会返回位于同一行中的多个索引。 我当然可以遍历idx1 中的所有重复行,并只保留x 中的值最低的索引,但我想知道是否有更pythonic 的方式。

谢谢

【问题讨论】:

  • 如果一行不包含任何低于 1.5 的值怎么办?你只是跳过这一行吗?
  • @jdehesa 是的,那我对那一行不感兴趣。仅在低于 1.5 的行列索引中,只要它们是其行的最低值

标签: python arrays numpy unique where


【解决方案1】:

你可以这样做:

# First index is all rows
idx1 = np.arange(len(x))
# Second index is minimum values
idx2 = np.argmin(m, axis=1)
# Filter rows where minimum is not below threshold
valid = x[idx1, idx2] < 1.5
idx1 = idx1[valid]
idx2 = idx2[valid]

【讨论】:

    【解决方案2】:

    一种方法是使用numpy masked array。让我们定义以下随机ndarray

    a = np.random.normal(1,2,(4,2))
    
    print(a.round(2))
    array([[ 1.41, -0.68],
           [-1.53,  2.74],
           [ 1.19,  2.66],
           [ 2.  ,  1.26]])
    

    我们可以定义一个掩码数组:

    ma = np.ma.array(a, mask = a >= 1.5)
    
    print(ma.round(2))
    [[1.41 -0.68]
     [-1.53 --]
     [1.19 --]
     [-- 1.26]]
    

    为了处理没有低于阈值的行,您可以这样做:

    m = ma.mask.any(axis=1)
    # array([ True,  True,  True,  True])
    

    如果给定行中没有有效值,它将包含False。 然后将np.argmin 放在掩码数组上,得到最小值低于 1.5 的列:

    np.argmin(ma, axis=1)[m]
    # array([1, 0, 0, 1])
    

    对于你可以做的行:

    np.flatnonzero(m)
    # array([0, 1, 2, 3])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-08
      • 2020-12-05
      • 2021-06-06
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      相关资源
      最近更新 更多