# -*- coding: utf-8 -*-
import numpy as np
# 对于二维数组
arr = np.array([[5, np.nan, np.nan, 7, 2, 3],
[3, np.nan, 1, 8, np.nan, 4],
[4, 9, 6, np.nan, np.nan, 5]])
mask = np.isnan(arr)
print('mask shape is: ', mask.shape)
idx = np.where(~mask, np.arange(mask.shape[1]), 0) # 按位判断~mask(非mask),真则为np.arange(mask.shape[1]), 假则为0
# 取历史合计最大值,输出为idx
np.maximum.accumulate(idx, axis=1, out=idx)
print('idx:\n', idx) # nan值全部变为0,其余值则是自然序列值
print('np.maximum.accumulate(idx, axis=1, out=idx):\n', np.maximum.accumulate(idx, axis=1, out=idx)) # 只要是0,则用前面一个值占位,输出为idx
out = arr[np.arange(idx.shape[0])[:, None], idx]
print('np.arange(idx.shape[0])[:, None]:\n', np.arange(idx.shape[0])[:, None])
print('np.arange(idx.shape[0])[:, None]:\n', np.arange(idx.shape[0])[:, None])
print('arr:\n', arr)
print('out:\n', out)
# 对于一维数组:
arr2 = np.array([5, np.nan, np.nan, 7, 2, 3, np.nan, 4])
mask2 = np.isnan(arr2)
print('mask2:\n', mask2)
idx2 = np.where(~mask2, np.arange(len(mask2)), 0) # 按位判断~mask(非mask),真则为np.arange(mask.shape[1]), 假则为0
np.maximum.accumulate(idx2, out=idx2)
out2 = arr2[idx2]
print('arr2:\n', arr2)
print('out2:\n', out2)