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

回答編集履歴

2

修正

2018/04/15 12:17

投稿

tachikoma
tachikoma

スコア3601

answer CHANGED
@@ -28,6 +28,14 @@
28
28
 
29
29
  最大の長さを返すよう若干修正したバージョン
30
30
  ```
31
+
32
+ In [51]: slen = 1000
33
+ ...: tslen = 1200
34
+ ...: N = 1000
35
+ ...:
36
+ ...: random.seed(0)
37
+ ...: s_org = [1]*(tslen-slen) + [random.randint(0, 1) for _ in range(1000)]
38
+ ...:
31
39
  In [52]: with timer("numpy"):
32
40
  ...: a = np.array(s_org)
33
41
  ...: offset = 1
@@ -38,4 +46,5 @@
38
46
  ...: len11 = (pos1to0 - pos0to1).max()
39
47
  ...:
40
48
  [numpy] done in 0.00026 s
49
+ In [53]: assert len11 == 202
41
50
  ```

1

追記

2018/04/15 12:17

投稿

tachikoma
tachikoma

スコア3601

answer CHANGED
@@ -16,4 +16,26 @@
16
16
  len11 = pos1to0 - pos0to1
17
17
  ```
18
18
 
19
- pythonのfor-loopが遅いので行列のインデックスを駆使した方法です。理解してコーディングしないと収拾がつかなくなるので、適度な用法用量を守ってご参考にしてください。
19
+ pythonのfor-loopが遅いので行列のインデックスを駆使した方法です。理解してコーディングしないと収拾がつかなくなるので、適度な用法用量を守ってご参考にしてください。
20
+
21
+ ----
22
+ 追記
23
+
24
+ mkgreyさんのコードそのまま回したケース
25
+ [groupby] done in 0.39933 s
26
+ [forward-search] done in 0.12787 s
27
+ [backward-search] done in 0.05486 s
28
+
29
+ 最大の長さを返すよう若干修正したバージョン
30
+ ```
31
+ In [52]: with timer("numpy"):
32
+ ...: a = np.array(s_org)
33
+ ...: offset = 1
34
+ ...: diff_a = a[1:] - a[:-1]
35
+ ...: pos1to0 = np.where(diff_a ==-1)[0] + offset
36
+ ...: pos0to1 = np.where(diff_a ==+1)[0] + offset
37
+ ...: pos0to1 = np.append([0], pos0to1)
38
+ ...: len11 = (pos1to0 - pos0to1).max()
39
+ ...:
40
+ [numpy] done in 0.00026 s
41
+ ```