python
1import numpy as np
2
3def get_between_zeros(arr, N):
4 """最初に現れた0でない値から、その次の0がN連続するまでの間を取得
5 """
6 arr = np.r_[arr, np.zeros(N, dtype=int)] # N連続0がない場合用
7 is_nonzero = arr != 0
8
9 # 始点=最初に現れた0以外の値の位置
10 s = is_nonzero.argmax()
11 # 始点より後ろで初めて0がN連続する箇所の位置
12 ln = np.convolve(is_nonzero[s:], np.ones(N, dtype=int), 'valid').argmin()
13 return arr[s:s+ln]
↓例
python
1a = np.array([0, 0, 1, 0, 14, 0, 0, 0])
2N = 3
3out = get_between_zeros(a, N)
4
5out
6# array([ 1, 0, 14])
7out.mean()
8# 5.0
python
1a = np.array([0, 1, 2, 3, 0, 1, 2, 3, 0, 0, 1, 2, 3, 0, 0, 0, 1, 2, 3])
2get_between_zeros(a, 1)
3# array([1, 2, 3])
4get_between_zeros(a, 2)
5# array([1, 2, 3, 0, 1, 2, 3])
6get_between_zeros(a, 3)
7# array([1, 2, 3, 0, 1, 2, 3, 0, 0, 1, 2, 3])
8get_between_zeros(a, 4)
9# array([1, 2, 3, 0, 1, 2, 3, 0, 0, 1, 2, 3, 0, 0, 0, 1, 2, 3])
追記(質問が変更されたので)
python
1def get_between_zeros(arr, N, return_index=False):
2 arr = np.r_[arr, np.zeros(N, dtype=int)]
3 is_nonzero = arr != 0
4 s = is_nonzero.argmax()
5 ln = np.convolve(is_nonzero[s:], np.ones(N, dtype=int), 'valid').argmin()
6
7 if return_index:
8 return arr[s:s+ln], (s, s+ln)
9 else:
10 return arr[s:s+ln]
11
12
13a = np.array([0, 1, 0, 10, 0, 0, 0, 11, 12, 0, 0, 0])
14
15outs = []
16for i in range(a.size):
17 out, (s, e) = get_between_zeros(a, 3, True)
18 outs.append(out.mean())
19 a[:e] = 0
20 if a.sum() == 0:
21 break
22
23outs
24# [3.6666666666666665, 11.5]