全要素が移動する(同じ位置に残らない)shuffle

全要素が移動する(同じ位置に残らない)shuffle – Qiita

この問題は収束が非常に速い事が予想されるので,単にひたすらシャッフルした方が速いだろう.
(試行数3回で約63%,6回で約86%の確率で目的を達する;ループが止まる)

sample sizeが100以下ならnumpyを使わず,ピュアに書いた方が速かった(略).

import numpy as np

li = np.random.randint(10, size=10000)

に対して,コメント欄の2つとプラスアルファを試す.

import numpy as np


def shuffle_all_move2(a):
    n = len(a)//2
    assert 2*n == len(a)
    g = np.array([0]*n+[1]*n)
    np.random.shuffle(g)
    t1,t2 = a[g==0],a[g==1]
    np.random.shuffle(t1)
    np.random.shuffle(t2)
    a[g==0],a[g==1] = t2,t1
    return a.tolist()
import numpy as np
import random

def shuffle_all_move3(items):
    res = items.copy()
    i = len(res)
    while i > 1:
        i = i - 1
        j = random.randrange(i)  # 0 <= j <= i-1
        res[j], res[i] = res[i], res[j]
    return res
import numpy as np
def shuffle_all_move6(x):
    ind = np.arange(len(x))
    res = np.random.permutation(ind)
    while np.any(res == ind):
        res = np.random.permutation(ind)
    return x[res]
li = np.random.randint(10, size=10)

%timeit shuffle_all_move2(li)
%timeit shuffle_all_move3(li)
%timeit shuffle_all_move6(li)

92 µs ± 1.19 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
298 µs ± 12.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
108 µs ± 1.75 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

li = np.random.randint(10, size=100)

%timeit shuffle_all_move2(li)
%timeit shuffle_all_move3(li)
%timeit shuffle_all_move6(li)

99 µs ± 6.64 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
303 µs ± 7.43 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
114 µs ± 5.39 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

li = np.random.randint(10, size=1000)

%timeit shuffle_all_move2(li)
%timeit shuffle_all_move3(li)
%timeit shuffle_all_move6(li)

280 µs ± 11.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
3.18 ms ± 227 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
197 µs ± 1.93 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

li = np.random.randint(10, size=10000)

%timeit shuffle_all_move2(li)
%timeit shuffle_all_move3(li)
%timeit shuffle_all_move6(li)

2.14 ms ± 153 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
30.1 ms ± 691 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
1.01 ms ± 29 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
 
 
 
FireShot Capture 211 - JupyterLab Alpha Preview - http___localhost_8888_lab

indexerを用意して一致しなくなるまで回した方が速いっぽ.

広告
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中