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

vcirk6k6  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(118)

我有一个二维numpy数组,其中某些行可能有nans。我想根据以下规定选择这些数组的行中是否存在nans:

  • 如果一行不是以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]

tpxzln5u

tpxzln5u1#

您可以使用hstack添加一列non-nan,使用isnan检查哪些值是nan,并使用argmin获取第一个non-nan的位置:

out = np.isnan(np.hstack([arr, np.ones((arr.shape[0], 1))])).argmin(axis=1)-1

字符串
或者不使用连接,使用where来修复all值为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])

相关问题