numpy数组中第一个nans序列的结束

4
我有一个二维的numpy数组,其中一些行可能包含nan值。根据以下规则,我想选择这些数组中行中nan值的出现或缺失情况:
- 如果一行不以nan值开头,则该数组的结果为-1。 - 如果一行以nan值开头,则结果将是从该行开头开始的连续的nan值序列中最后一个nan值的索引。
在我的实际工作中,我将处理包含数百万行的numpy数组。请问,有什么最优的方法可以实现这个功能吗?
以以下数组为例:
import numpy as np

arr = np.array([[1,11,np.nan,111,1111],
               [np.nan, np.nan, np.nan, 2, 22],
               [np.nan, np.nan, 3, 33, np.nan],
               [4, np.nan, np.nan, 44, 444],
               [np.nan, 5, 55, np.nan, 555],
               [np.nan, np.nan, np.nan, np.nan, np.nan]])

这里的预期结果将是 result = [-1, 2, 1, -1, 0, 4]
以下是我尝试过的成功代码。但是,我希望有一个更优化的解决方案。
result = []

for i in range(arr.shape[0]):
    if np.isnan(arr[i])[0] == False:
        result += [-1]
    elif np.all(np.isnan(arr[i])):
        result += [arr.shape[1]-1]
    else:
        result += [np.where(np.isnan(arr[i]) == False)[0][0] - 1]
1个回答

3
你可以使用hstack添加一个非NaN的列,使用isnan检查哪些值是NaN,并使用argmin获取第一个非NaN的位置:
out = np.isnan(np.hstack([arr, np.ones((arr.shape[0], 1))])).argmin(axis=1)-1

或者不使用连接,并使用where来修复所有值都为nan的情况:

tmp = np.isnan(arr)

out = np.where(tmp.all(axis=1), arr.shape[1], tmp.argmin(axis=1))-1

输出:

out = array([-1,  2,  1, -1,  0,  4])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接