配列をランダムに取り出したいときに、インデックスの連番を配列にしてシャッフルすることがあると思います。
numpy ありなら簡単に思いつくのですが、問題は、numpy なしの場合。
あまりにも numpy に慣れてしまうと numpy なし環境で作らないといけない状況で戸惑ってしまったので記載しておきました。
例えば、IDとパスワードが入った2つの配列や、問題と正解が入った配列などです。
1 2 3 4 |
ids = ["ID1", "ID2", "ID3"] pws = ["PW1", "PW2", "PW3"] |
これをランダムに全て取りしたいときに、インデックスの配列を作ります。
1 2 3 |
list_idx = [0, 1, 2] |
この、list_idx をランダムにシャッフルすると、
1 2 3 |
list_idx =[2, 0, 1] |
そして、普通にfor文で回せばランダムに取り出せます。
1 2 3 4 5 |
for i in range(len(list_idx)) : print(ids[list_idx[i]]) print(pws[list_idx[i]]) |
結果は
1 2 3 4 5 6 7 8 |
ID3 PW3 ID1 PW1 ID2 PW2 |
と、ランダムに全ての値が取れました。
ちょっと長くなりましたが、こんな使い方をするときにnumpyなら簡単に
1 2 3 4 5 |
import numpy as np index_list = np.arange(10) np.random.shuffle(index_list) |
これで、index_list は
1 2 3 4 |
index_list array([0, 6, 3, 1, 8, 4, 7, 5, 2, 9]) |
になります。
numpy なしの場合は。
python3系
1 2 3 4 5 |
import random index_list = list(range(0,10)) random.shuffle(index_list) |
これで、index_list は
1 2 3 |
[7, 9, 1, 5, 0, 3, 6, 8, 4, 2] |
python2系
1 2 3 4 5 |
import random index_list = list(xrange(0,10)) random.shuffle(index_list) |
これで、index_list は
1 2 3 |
[5, 7, 6, 4, 0, 9, 2, 1, 3, 8] |
となりました。