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

回答編集履歴

1

修正

2021/04/21 07:16

投稿

kirara0048
kirara0048

スコア1399

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
- 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]
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 [111]: extract(np.array(l), [1, 2, 3], 4)
46
+ In [13]: extract(np.array(l), [1, 2, 3], 4)
43
- Out[111]:
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
  ```