如何在numpy矩阵中有效地找到行的leftest非null值的索引列?

tot*_*ico 3 python numpy

我想知道是否有一种快速的方法来找到每行的leftest非null值的索引numpy矩阵.

免得说我有这个:

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]])
Run Code Online (Sandbox Code Playgroud)

我想分别返回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)
Run Code Online (Sandbox Code Playgroud)

Div*_*kar 5

获取非空值的布尔数组,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.])
Run Code Online (Sandbox Code Playgroud)

  • @SashaTsukanov`argmax`返回沿轴的第一次出现的最大值的索引.在布尔数组中,这意味着"真" (2认同)