Как получить минимальное число из 5 предыдущих чисел вектора?

Есть вектор с числами:

import numpy as np
arr = np.array([18, 4, 15, 14, 6, 7, 11, 12, 8, 5, 7, 0, 12, 0, 2, 18])

Ожидаемый результат:

[nan nan nan nan  4.  4.  6.  6.  6.  5.  5.  0.  0.  0.  0.  0.]

Решение с циклом:

period = 5
lowest = np.full_like(arr, np.nan, dtype=float)

for i in range(period-1, len(arr)):
    lowest[i] = np.min(arr[i-(period-1) : i+1])

Можно ли получить векторизированным способом, без цикла?


Ответы (1 шт):

Автор решения: MaxU

решение в Pandas - воспользуйтесь Series.rolling(...):

import pandas as pd

s = pd.Series(arr)
res = s.rolling(5).min()

результат:

In [316]: res
Out[316]:
0     NaN
1     NaN
2     NaN
3     NaN
4     4.0
5     4.0
6     6.0
7     6.0
8     6.0
9     5.0
10    5.0
11    0.0
12    0.0
13    0.0
14    0.0
15    0.0
dtype: float64

или в виде numpy.NDArray:

In [317]: res.to_numpy()
Out[317]:
array([nan, nan, nan, nan,  4.,  4.,  6.,  6.,  6.,  5.,  5.,  0.,  0., 0.,  0.,  0.])
→ Ссылка