読者です 読者をやめる 読者になる 読者になる

山下寛人オフィシャルブログ

オイシックス株式会社 執行役員 システム本部長 山下寛人の公式ブログです。

ndarrayのちょい技

最近オイシックスPythonをやっております。scikit-learnなどで機械学習など手を付けています。

scikit-learnをやる前にnumpyを覚えておくといろいろ便利です。for分でごりごりループして書いたりするよりこんなことできないかなと思ったらだいたいできますね。そんなふうにして見つけた技を紹介します。

2次元の配列dataがあったとします。numpyはimport numpy as npとしてインポートします。

・多次元配列からの無作為抽出

data = data[np.random.choice(data.shape[0], 5000, replace=False), :]

random.choiceは無作為抽出をしてくれます。が、1次元配列からしかできません。最初の引数に配列でなく整数を渡すとその数値までの配列を作ってそこから無作為抽出をします。それを利用して抽出する列番号を出して取り出します。
data.shapeは配列の各次元の大きさを表示します。2次元だと何行で何列です。

>>> data.shape
(92568, 2)

92568行から無作為に抽出します。なので最初の引数はdata.shape[0]になります。
2番めの引数は何個取り出すか。ここでは5000個としています。
replaceという引数は、重複を許すかどうか。デフォルトだと重複ありなのでFalseを指定します。

>>> np.random.choice(data.shape[0], 5000, replace=False)
array([47794, 78156, 42097, ..., 10104, 47779, 89019])

こんな具合で取り出す行番号がランダムに5000個出てきます。
これを最初の添字にして2番めはコロンにしておくとその行の要素全部という意味になり、無作為抽出になります。

>>> data[np.random.choice(data.shape[0], 5000, replace=False), :]
array([[ 1115.2   ,  2746.    ],
       [  351.3333,  4032.1667],
       [ 2077.5385,  2192.6154],
       ..., 
       [  964.1   ,  3427.1   ],
       [ 1587.    ,  3405.5   ],
       [ 1037.5385,  5365.0769]])

うまくできました。