回答編集履歴

1

修正

2021/04/21 07:16

投稿

kirara0048
kirara0048

スコア1399

test CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  vln = len(v)
22
22
 
23
- base = arr.max() ** np.arange(vln)
23
+ base = (arr.max()+1) ** np.arange(vln)
24
24
 
25
25
  search_idx, = np.nonzero(np.convolve(arr, base) == np.sum(base*v[::-1]))
26
26
 
@@ -64,7 +64,15 @@
64
64
 
65
65
  # @aokikenichi さんの作成した配列に対して
66
66
 
67
+ In [12]: l = [0, 1, 2, 3,
68
+
69
+ ...: 13, 10, 5, 4, 3, 2, 1, 0,
70
+
71
+ ...: 13, 10, 1, 2, 3, 4, 5, 6, 7,
72
+
73
+ ...: 13, 10, 99, 98, 97, 96, 95, 94,
74
+
67
- In [12]: l = [0, 1, 2, 3, 13, 10, 5, 4, 3, 2, 1, 0, 13, 10, 1, 2, 3, 4, 5, 6, 7, 13, 10, 99, 98, 97, 96, 95, 94, 13, 10, 100, 101, 102, 103, 104, 105]
75
+ ...: 13, 10, 100, 101, 102, 103, 104, 105]
68
76
 
69
77
  ...: extract(np.array(l), [13, 10], 3)
70
78
 
@@ -80,9 +88,9 @@
80
88
 
81
89
  # 条件を変えることもできます
82
90
 
83
- In [111]: extract(np.array(l), [1, 2, 3], 4)
91
+ In [13]: extract(np.array(l), [1, 2, 3], 4)
84
92
 
85
- Out[111]:
93
+ Out[13]:
86
94
 
87
95
  array([[13, 4],
88
96
 
@@ -93,3 +101,55 @@
93
101
  [ 4, 7]])
94
102
 
95
103
  ```
104
+
105
+
106
+
107
+ ---
108
+
109
+
110
+
111
+ @aokikenichi さんの回答は一般化すると以下のような関数になりますが、
112
+
113
+
114
+
115
+ ```python
116
+
117
+ def extract_for(l, v, n):
118
+
119
+ vln = len(v)
120
+
121
+ out = []
122
+
123
+ for i in range(len(l) - 1):
124
+
125
+ if all(l[i+j] == vi for j, vi in enumerate(v)):
126
+
127
+ out.append(l[i+vln:i+vln+n])
128
+
129
+ return np.array(out).T
130
+
131
+ ```
132
+
133
+
134
+
135
+ 速度を比較するとNumpyの関数を用いたほうが効率が良いことがわかります。
136
+
137
+
138
+
139
+ ```python
140
+
141
+ # arrは長さ100000の配列
142
+
143
+ In [21]: %timeit extract(arr, [13, 10], 8)
144
+
145
+ 698 µs ± 15.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
146
+
147
+
148
+
149
+ In [22]: l = arr.tolist()
150
+
151
+ ...: %timeit extract_for(l, [13, 10], 8)
152
+
153
+ 78 ms ± 1.32 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
154
+
155
+ ```