numpyメモ

numpyメモ

randomモジュールとnumpy.randomモジュール

randomモジュールとnumpy.randomモジュールに関する自分なりの整理。

まずは大まかな違いから。

  • randomモジュールはランダムな値(スカラー)をひとつ返す
  • numpy.randomモジュールはランダムな値のテンソル(行列)を返す

つぎに細かい違い。

  • randomモジュールの関数は引数にタプルをとらない(スカラーしか返さないので)
  • numpy.randomモジュールの関数はテンソルの形状を指定するためにタプルを引数にとることがある

0以上1未満の浮動小数点数。

任意の範囲の浮動小数点数。

任意の範囲の整数。

random.randrangeはrandom.randintとほぼおなじだし、個人的にあまり使わなそうなのでカット。

以下、対応関係。

用途 random numpy.random
0以上1未満の浮動小数点数 random.random np.random.rand
任意の範囲の浮動小数点数 random.uniform np.random.uniform
任意の範囲の整数 random.randint np.random.randint

正規分布などについては今回はスルー。基本のみ。

random.choice/choices/sampleとnp.random.choiceを比較

random.choice

random.choiceはリスト(やタプル・文字列)から要素をひとつ選ぶ。オプションはない。

random.choices

random.choicesは複数の要素を重複ありで選ぶ。重複なしのオプションはない。

よく使うオプションはweightsで、要素を選ぶ確率を指定することができる。

random.sample

random.sampleは複数の要素を重複なしで選ぶ。weightsオプションはない。

np.random.choice

np.random.choiceは重複あり/なしで複数の要素を選べる。選ぶ個数はrandom.chocesのkとちがってsizeで、タプルで指定するとテンソルの形で返してくれる。重み(確率)を指定するオプションはp。

すこし変わっているのは、0より大きい整数Nを指定すると0~N-1から選ぶ。戻り値の型はint。この機能いる?w

ついでに

random.choicesにnumpy配列を与えてみたがふつうに動く。iterableだったらなんでも受け付ける感じなのかな。

地味に便利な形状指定方法

たとえば学習用のトイデータを作成する場合、このようなコードを書くことがある。

Xのサイズを調べてrandn関数に書かなければならないわけだが、これが面倒。

こう書きたくなるが、タプルはだめよと怒られる。どうにかならないかなといろいろ試した結果、これでうまくいった。

タプルやリストに*をつけて関数の引数にわたすと展開される。ちなみに辞書型を展開するには**をつける。

np.arangeは

np.arangeはrange関数の少数まで指定できるバージョン。

ということはnp.linspaceにも対応するpythonのビルトイン関数があるかも、と思ったがないみたい。

軸の入れ替え(numpy.transpose / K.permute_dimensions)

2次元テンソルの軸の入れ替えは縦横入れ替えるだけなのでわかりやすいが、3次元以上になるとこんがらがる。ただ、深層学習でこれが登場するのは画像を扱っているときが多い。

(縦,横,チャネル)と(チャネル,縦,横)のふたつのパターンがあるが、これを相互変換するときに出てくることが多い。

(縦,横,チャネル)のテンソルxがあったとして

(チャネル,縦,横)に軸を入れ替える。これは意味的にはRGBの1枚の画像→R(赤成分)の画像、G(緑成分)の画像、B(青成分)の画像の3枚に分けたと考えると理解しやすい。

もっと一般的にいうと、最後の軸の特徴量ごとにテンソルを分離するということ。というのが現在の理解。

最後の軸(チャネルの軸)を手前(サンプル(バッチ)次元のひとつあと)に持ってくる以外の軸の入れかえっていまのところ見たことない。

一般的な場合でtransposeを理解するのは凡人には無理だが(任意の軸の入れ替えとか考えるとアタマがショートする)、現実に出てくるパターンに絞って理解することはできる。

numpy配列の保存と読み込み

連番の行列を生成する

ランダムな要素からなる行列はかんたんにつくれる。

ただ、ランダムな要素だとなにか処理したあと、どの要素がどこにいったのか確認しづらい。連番からなる行列を生成したい。それにはnp.arangeで連番の配列を生成してからreshapeすればいい。トンチか。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする