Sponsored Link

カテゴリー別アーカイブ: 乱数

(36) 配列データをシャッフル

(36) 配列データをシャッフル

random.shuffle を使用すると、配列要素をシャッフルできる。

>>> import random
>>>
>>> a = range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
>>> random.shuffle(a)
>>> a
[6, 9, 1, 4, 5, 0, 2, 8, 7, 3]

文字列配列でもOK!

>>> b = ['aaa','BBB','ccc','dDd','eEE']
>>> b
['aaa', 'BBB', 'ccc', 'dDd', 'eEE']
>>>
>>> random.shuffle(b)
>>> b
['BBB', 'aaa', 'dDd', 'ccc', 'eEE']

numpy配列の場合は numpay.random.shuffle で同じことができる。

>>> import numpy as np
>>> import numpy.random as nr
>>>
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>>
>>> nr.shuffle(a)
>>> a
array([0, 6, 4, 3, 5, 8, 9, 2, 7, 1])

応用

ファイル検索で得られたファイルリストをシャッフルする。

以下のようなテキストファイルが置かれたディレクトリに対してファイル検索する。

[user@linux]$ ll ./sub/
合計 28
-rw-rw-r--. 1 user user 35  7月 10 23:35 2014 text001.txt
-rw-rw-r--. 1 user user 35  7月 10 23:35 2014 text002.txt
-rw-rw-r--. 1 user user 35  7月 10 23:35 2014 text003.txt
-rw-rw-r--. 1 user user 35  7月 10 23:35 2014 text004.txt
-rw-rw-r--. 1 user user 35  7月 10 23:35 2014 text005.txt
-rw-rw-r--. 1 user user 35  7月 10 23:35 2014 text006.txt
-rw-rw-r--. 1 user user 35  7月 10 23:35 2014 text007.txt

glob を使ってファイルリストを取得し、これをシャッフルしてみる。

>>> import glob
>>> files = glob.glob('./sub/*.txt')
>>> files
['./sub/text002.txt', './sub/text005.txt', './sub/text006.txt',
 './sub/text003.txt', './sub/text001.txt', './sub/text004.txt',
 './sub/text007.txt']
>>>
>>> import random
>>> random.shuffle(files)
>>> files
['./sub/text005.txt', './sub/text002.txt', './sub/text004.txt',
 './sub/text003.txt', './sub/text001.txt', './sub/text006.txt',
 './sub/text007.txt']

(25) numpyで乱数を生成

(25) numpyで乱数を生成

numpy.random.rand を使用して実数の乱数配列を生成する。
numpy.random.randint を使用して整数の乱数配列を生成する。

>>> import numpy as np
>>> np.random.rand(10)
array([ 0.36231987,  0.26958951,  0.91354098,  0.66874027,  0.704188  ,
        0.3669771 ,  0.9351947 ,  0.97054988,  0.05415556,  0.0120051 ])

2次元配列も作れる。

>>> np.random.rand(10,5)
array([[ 0.18057302,  0.732112  ,  0.73570813,  0.31276078,  0.74386724],
       [ 0.34098013,  0.57740663,  0.38940087,  0.75841537,  0.48696981],
       [ 0.55155841,  0.07432334,  0.64554935,  0.75573921,  0.72851735],
       [ 0.67891244,  0.50691657,  0.67023707,  0.68459258,  0.59727912],
       [ 0.52673635,  0.38148081,  0.38091377,  0.77393508,  0.23767506],
       [ 0.9007612 ,  0.459175  ,  0.61066911,  0.74963848,  0.41388143],
       [ 0.8425936 ,  0.65534958,  0.04201763,  0.2361347 ,  0.90097734],
       [ 0.5658974 ,  0.65926714,  0.8321856 ,  0.86968125,  0.99100652],
       [ 0.27978176,  0.09986267,  0.32118296,  0.13473018,  0.34219306],
       [ 0.21003417,  0.57915006,  0.20604767,  0.78571055,  0.08694739]])

3次元配列も作れる。

>>> np.random.rand(4,3,2)
array([[[ 0.78210148,  0.52274031],
        [ 0.91981503,  0.76674411],
        [ 0.61590378,  0.68904415]],

       [[ 0.35814928,  0.95472689],
        [ 0.9389849 ,  0.75284964],
        [ 0.43892884,  0.68375844]],

       [[ 0.33013363,  0.93588433],
        [ 0.81682107,  0.26105761],
        [ 0.45356643,  0.14149969]],

       [[ 0.67429765,  0.15207684],
        [ 0.31640331,  0.7342912 ],
        [ 0.90368026,  0.04494939]]])

0~10の範囲の整数乱数1個を生成する。

>>> np.random.randint(10)
1
>>> np.random.randint(0,10)
7

3~10の範囲の整数乱数1個を生成する。

>>> np.random.randint(3,10)
6

3~10の範囲かつ要素数4の整数乱数配列を生成する。

>>> np.random.randint(3,10,4)
array([9, 5, 8, 9])

3~10の範囲かつ要素数4×3の整数乱数配列を生成する。

>>> np.random.randint(3,10,(4,3))
array([[7, 6, 3],
       [4, 5, 3],
       [3, 8, 3],
       [8, 7, 9]])