代码之家  ›  专栏  ›  技术社区  ›  toto_tico

如何有效地找到numpy矩阵中行的最左非空值的索引列?

  •  3
  • toto_tico  · 技术社区  · 6 年前

    恐怕我有这个:

    data = np.array([[np.nan, np.nan, 10,      1],
                     [np.nan, 30,      50,      np.nan],
                     [40,      np.nan, np.nan, 5],
                     [np.nan, np.nan, np.nan, 10]])
    

    我想返回分别为10、30、40和10的索引,即2、1、0和3。

    下面的方法有效,但并不完全有效(例如 fn 功能很慢):

    def fn(row):
        for idx, v in enumerate(row):
             if not np.isnan(v):
                  return idx
    np.apply_along_axis(fn, 1, data)
    
    1 回复  |  直到 6 年前
        1
  •  5
  •   Divakar    6 年前

    获取非空的布尔数组 np.isnan 然后每排第一个 argmax(1) 对于这些索引,最后索引到输入数组中-

    In [19]: idx = (~np.isnan(data)).argmax(1)
    
    In [20]: idx
    Out[20]: array([2, 1, 0, 3])
    
    In [21]: data[np.arange(len(idx)), idx]
    Out[21]: array([10., 30., 40., 10.])