给定一个类似于这样的numpy数组(或pandas数据帧):
import numpy as np
a = np.array([
[1, 1, 1, 0.5, np.nan, np.nan, np.nan],
[1, 1, 1, np.nan, np.nan, np.nan, np.nan],
[1, 1, 1, 0.5, 0.25, 0.125, 0.075],
[1, 1, 1, 0.25, np.nan, np.nan, np.nan],
[1, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
[1, 1, 0.5, 0.5, np.nan, np.nan, np.nan]
])
我希望能够高效地检索每行中最后一个非NaN值,因此在这种情况下,我需要寻找一个返回类似于以下内容的函数:
np.array([3,
2,
6,
3,
0,
3])
我可以尝试使用
np.argmin(a, axis=1) - 1
,但这种方法至少有两个缺点-对于不以nan
结尾的行无法处理(不能接受),而且它不是"惰性评估",只要到达给定行中的最后一个非nan
值就会停止(这一点没有“必须正确”的条件那么重要)。我想用
np.where
应该也可以实现,但是除了要评估每行所有元素之外,我无法看出明显的优雅方法来重新排列输出,以获取每行中的最后一个索引。>>> np.where(np.isnan(a))
(array([0, 0, 0, 1, 1, 1, 1, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5]),
array([4, 5, 6, 3, 4, 5, 6, 4, 5, 6, 1, 2, 3, 4, 5, 6, 4, 5, 6]))