疑似ランダム系列を作る(Python)

実験試行ごとに異なる条件が出現する場合、試行を無作為化(ランダマイズ)すると思います。
ところがただシャッフルすると、同じ条件の試行が連続していくつも続くことがあり得てしまい、オペラントでの変な学習や馴化が懸念されます。
ここでは、同じ条件を伴う試行が一定の回数以上連続して続かないような、疑似ランダム系列を作ります。
データベクトルをシャッフルしたのちにソートする力技もあると思いますが、同じ異なる条件が行ごとに一つずつ含まれる多次元配列を行単位でシャッフルしていくと楽です。
まずNumpyのarrayで、試行数=条件数×繰り返し3回の行列を作ります。その後、0 ~ 2の3つの条件を、シャッフルしながら各行へ代入します。最後に、行列DATを関数flattenで、各行を先頭からひとつながりのベクトルに変換します。

>>> import numpy as np
>>> a = [0, 1, 2]
>>> DAT = np.zeros((3,3),dtype=int)
>>> DAT
array([0, 0, 0],
      [0, 0, 0],
      [0, 0, 0]])
>>> for i in range(0,len(DAT[:,1])):
...	np.random.shuffle(a)
...	DAT[[i]] = a
...	
>>> DAT
array([1, 2, 0],
      [1, 0, 2],
      [2, 1, 0]])
>>> dat = DAT.flatten()
>>> dat
array([1, 2, 0, 1, 0, 2, 2, 1, 0])
2020.04.29 一部改変
pandasを使ってループを使わずに書くこともできます。
>>> import numpy as np
>>> import pandas as pd
>>> a=[0, 1, 2]
>>> DAT = np.repeat([a], len(a), axis = 0)
>>> DAT
array([[0, 1, 2],
       [0, 1, 2],
       [0, 1, 2]])
>>> DAT2=pd.DataFrame(DAT)
>>> DAT2
   0  1  2
0  0  1  2
1  0  1  2
2  0  1  2
>>> DAT2.apply(np.random.shuffle, axis = 1)
>>> dat=DAT2.to_numpy().flatten()
>>> dat
array([1, 2, 0, 0, 1, 2, 1, 0, 2])

↑ PAGE TOP