使用numpy查找ndarray中最长的非空段

kokeuurv  于 2023-02-19  发布在  其他
关注(0)|答案(1)|浏览(131)

我有一个形状为(2,12)的数组ab

ab = np.array([[0,3,6,3,np.nan,3,7,3,5,4,3,np.nan],
      [5,9,np.nan,3,7,5,3,6,4,np.nan,np.nan,np.nan]])

我试图获取两行之间连续的非空值的最长段。从上面的例子中,输出应该是:

[[3. 7. 3. 5.]
 [5. 3. 6. 4.]]

我在这里使用了为类似问题提出的解决方案:Find longest subsequence without NaN values in set of series,将数组转换为 Dataframe 后:

df = pd.DataFrame(ab.T)
seq = np.array(df.dropna(how='any').index)
longest_seq = max(np.split(seq, np.where(np.diff(seq)!=1)[0]+1), key=len)
print(df.iloc[longest_seq])

    0    1
5  3.0  5.0
6  7.0  3.0
7  3.0  6.0
8  5.0  4.0

但是,是否有可能只使用numpy找到解决方案?
谢谢

j8ag8udp

j8ag8udp1#

我不确定您的代码是否能处理这样的序列长度在不同行之间不同的情况,相反,我将逐行进行:

res = []
for array in ab:
    # First, let's prepend a nan for regularity:
    arr = np.append(np.nan, array)
    nanindexes = np.nonzero(np.isnan(arr))[0]
    longest = max(np.split(arr, nanindexes), key=len) # select the biggest slice, they all start with nan
    longest = longest[1:] # remove the nan we added, or the starting one
    res.append(longest)

print(res)
[array([3., 7., 3., 5., 4., 3.]), array([3., 7., 5., 3., 6., 4.])]

我对numpy不太熟悉,所以我把你的问题当作一个练习。可能有很多方法可以改进代码。

相关问题