回答編集履歴
1
修正
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
|
-
|
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 [1
|
91
|
+
In [13]: extract(np.array(l), [1, 2, 3], 4)
|
84
92
|
|
85
|
-
Out[1
|
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
|
+
```
|