Массив Numpy: обрезать NaN с одной стороны и прокладку с другой

Предположим, у меня есть пустой массив, который выглядит так:

test = np.array([[np.nan, np.nan, np.nan, 3., 4., np.nan],
                 [np.nan, np.nan, 5., 6., np.nan, np.nan]])

Я хотел бы обрезать NaNs справа от числовых значений, но добавьте их слева, чтобы сохранить форму, т.е. результат должен выглядеть следующим образом:

array([[nan, nan, nan, nan,  3.,  4.],
       [nan, nan, nan, nan,  5.,  6.]])

Я думаю, что это может работать так:

def trim_and_pad(onedarray):
    onedarray[np.isnan(onedarray)] = 0.
    trimmed = np.trim_zeros(onedarray, trim='b')
    padded = np.pad(trimmed, pad_width=(onedarray.size-trimmed.size, 0), mode='constant')
    padded[padded == 0.] = np.nan
    return padded
np.apply_along_axis(trim_and_pad, 1, test)

Тем не менее, это кажется мне странным, особенно потому что это вычислительно дорого (мой массив на самом деле намного больше) и может вызвать проблемы, когда в массиве есть фактические нули до обрезки. Есть идеи, что может быть умнее, чтобы получить тот же результат?

0 ответов

Другие вопросы по тегам