回答編集履歴
2
追記(質問が変更されたので)
answer
CHANGED
@@ -37,4 +37,33 @@
|
|
37
37
|
# array([1, 2, 3, 0, 1, 2, 3, 0, 0, 1, 2, 3])
|
38
38
|
get_between_zeros(a, 4)
|
39
39
|
# array([1, 2, 3, 0, 1, 2, 3, 0, 0, 1, 2, 3, 0, 0, 0, 1, 2, 3])
|
40
|
+
```
|
41
|
+
|
42
|
+
## 追記(質問が変更されたので)
|
43
|
+
|
44
|
+
```python
|
45
|
+
def get_between_zeros(arr, N, return_index=False):
|
46
|
+
arr = np.r_[arr, np.zeros(N, dtype=int)]
|
47
|
+
is_nonzero = arr != 0
|
48
|
+
s = is_nonzero.argmax()
|
49
|
+
ln = np.convolve(is_nonzero[s:], np.ones(N, dtype=int), 'valid').argmin()
|
50
|
+
|
51
|
+
if return_index:
|
52
|
+
return arr[s:s+ln], (s, s+ln)
|
53
|
+
else:
|
54
|
+
return arr[s:s+ln]
|
55
|
+
|
56
|
+
|
57
|
+
a = np.array([0, 1, 0, 10, 0, 0, 0, 11, 12, 0, 0, 0])
|
58
|
+
|
59
|
+
outs = []
|
60
|
+
for i in range(a.size):
|
61
|
+
out, (s, e) = get_between_zeros(a, 3, True)
|
62
|
+
outs.append(out.mean())
|
63
|
+
a[:e] = 0
|
64
|
+
if a.sum() == 0:
|
65
|
+
break
|
66
|
+
|
67
|
+
outs
|
68
|
+
# [3.6666666666666665, 11.5]
|
40
69
|
```
|
1
詳細に
answer
CHANGED
@@ -1,15 +1,40 @@
|
|
1
1
|
```python
|
2
2
|
import numpy as np
|
3
3
|
|
4
|
+
def get_between_zeros(arr, N):
|
5
|
+
"""最初に現れた0でない値から、その次の0がN連続するまでの間を取得
|
6
|
+
"""
|
7
|
+
arr = np.r_[arr, np.zeros(N, dtype=int)] # N連続0がない場合用
|
8
|
+
is_nonzero = arr != 0
|
9
|
+
|
10
|
+
# 始点=最初に現れた0以外の値の位置
|
11
|
+
s = is_nonzero.argmax()
|
12
|
+
# 始点より後ろで初めて0がN連続する箇所の位置
|
13
|
+
ln = np.convolve(is_nonzero[s:], np.ones(N, dtype=int), 'valid').argmin()
|
14
|
+
return arr[s:s+ln]
|
15
|
+
```
|
16
|
+
|
17
|
+
↓例
|
18
|
+
|
19
|
+
```python
|
4
20
|
a = np.array([0, 0, 1, 0, 14, 0, 0, 0])
|
21
|
+
N = 3
|
22
|
+
out = get_between_zeros(a, N)
|
5
23
|
|
6
|
-
is_nonzero = a != 0
|
7
|
-
s = is_nonzero.argmax()
|
8
|
-
ln = np.convolve(is_nonzero[s:], np.ones(3), 'valid').argmin()
|
9
|
-
out = a[s:s+ln]
|
10
|
-
|
11
24
|
out
|
12
25
|
# array([ 1, 0, 14])
|
13
26
|
out.mean()
|
14
27
|
# 5.0
|
28
|
+
```
|
29
|
+
|
30
|
+
```python
|
31
|
+
a = np.array([0, 1, 2, 3, 0, 1, 2, 3, 0, 0, 1, 2, 3, 0, 0, 0, 1, 2, 3])
|
32
|
+
get_between_zeros(a, 1)
|
33
|
+
# array([1, 2, 3])
|
34
|
+
get_between_zeros(a, 2)
|
35
|
+
# array([1, 2, 3, 0, 1, 2, 3])
|
36
|
+
get_between_zeros(a, 3)
|
37
|
+
# array([1, 2, 3, 0, 1, 2, 3, 0, 0, 1, 2, 3])
|
38
|
+
get_between_zeros(a, 4)
|
39
|
+
# array([1, 2, 3, 0, 1, 2, 3, 0, 0, 1, 2, 3, 0, 0, 0, 1, 2, 3])
|
15
40
|
```
|