回答編集履歴
1
修正
answer
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
n: 取り出す個数(int)
|
10
10
|
"""
|
11
11
|
vln = len(v)
|
12
|
-
base = arr.max() ** np.arange(vln)
|
12
|
+
base = (arr.max()+1) ** np.arange(vln)
|
13
13
|
search_idx, = np.nonzero(np.convolve(arr, base) == np.sum(base*v[::-1]))
|
14
14
|
idx = search_idx + np.arange(1, n+1)[:, None]
|
15
15
|
return arr[idx]
|
@@ -31,7 +31,11 @@
|
|
31
31
|
[93, 16, 45, 68, 55, 23, 1, 25, 35, 21]])
|
32
32
|
|
33
33
|
# @aokikenichi さんの作成した配列に対して
|
34
|
+
In [12]: l = [0, 1, 2, 3,
|
35
|
+
...: 13, 10, 5, 4, 3, 2, 1, 0,
|
36
|
+
...: 13, 10, 1, 2, 3, 4, 5, 6, 7,
|
37
|
+
...: 13, 10, 99, 98, 97, 96, 95, 94,
|
34
|
-
|
38
|
+
...: 13, 10, 100, 101, 102, 103, 104, 105]
|
35
39
|
...: extract(np.array(l), [13, 10], 3)
|
36
40
|
Out[12]:
|
37
41
|
array([[ 5, 1, 99, 100],
|
@@ -39,10 +43,36 @@
|
|
39
43
|
[ 3, 3, 97, 102]])
|
40
44
|
|
41
45
|
# 条件を変えることもできます
|
42
|
-
In [
|
46
|
+
In [13]: extract(np.array(l), [1, 2, 3], 4)
|
43
|
-
Out[
|
47
|
+
Out[13]:
|
44
48
|
array([[13, 4],
|
45
49
|
[10, 5],
|
46
50
|
[ 5, 6],
|
47
51
|
[ 4, 7]])
|
52
|
+
```
|
53
|
+
|
54
|
+
---
|
55
|
+
|
56
|
+
@aokikenichi さんの回答は一般化すると以下のような関数になりますが、
|
57
|
+
|
58
|
+
```python
|
59
|
+
def extract_for(l, v, n):
|
60
|
+
vln = len(v)
|
61
|
+
out = []
|
62
|
+
for i in range(len(l) - 1):
|
63
|
+
if all(l[i+j] == vi for j, vi in enumerate(v)):
|
64
|
+
out.append(l[i+vln:i+vln+n])
|
65
|
+
return np.array(out).T
|
66
|
+
```
|
67
|
+
|
68
|
+
速度を比較するとNumpyの関数を用いたほうが効率が良いことがわかります。
|
69
|
+
|
70
|
+
```python
|
71
|
+
# arrは長さ100000の配列
|
72
|
+
In [21]: %timeit extract(arr, [13, 10], 8)
|
73
|
+
698 µs ± 15.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
|
74
|
+
|
75
|
+
In [22]: l = arr.tolist()
|
76
|
+
...: %timeit extract_for(l, [13, 10], 8)
|
77
|
+
78 ms ± 1.32 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
|
48
78
|
```
|