teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記(質問が変更されたので)

2020/07/29 08:36

投稿

kirara0048
kirara0048

スコア1399

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

詳細に

2020/07/29 08:36

投稿

kirara0048
kirara0048

スコア1399

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
  ```