keisukeのブログ

***乱雑です!自分用のメモです!*** 統計や機械学習の勉強と、読み物を書く練習と、備忘録用のブログ

numpyの1d-arrayを2d-arrayに変換

超基本的だけど毎回微妙にむかつくので整理するためにメモ.

numpyはベクトルと行列を分けているので*1,ベクトルの転置が取れなくて困る.
n次元ベクトルxは,numpyでは行ベクトルでも列ベクトルでもない.単にn次元ベクトル.
だからx.transpose()してもなにも起きない.ベクトルにtranspose()したらエラー投げて欲しい.

明示的に行ベクトルや列ベクトルにするときは,行ベクトルなら1xn行列,列ベクトルならnx1行列を作る必要がある.
n次元ベクトルxから行ベクトル(横ベクトル)を作るときは,x.reshape(1, n).
列ベクトル(縦ベクトル)を作るときは,x.reshape(n, 1).

x.reshape(-1, n)でも問題ない.reshapeではtupleの要素にひとつだけ-1を指定できる.-1を指定された次元は,他の明示的に指定した次元と元のベクトルの長さから自動的に決定される.

x[:, np.newaxis]とx[np.newaxis, :]という書き方もあるけど,「:」の意味がわかりづらくなる書き方だからあまり好きじゃない.xはベクトルなのに,np.newaxisをいいことに第二次元にアクセスしてるみたいで気持ち悪い.

ちなみに,列ベクトル(縦ベクトル)を作りたいときに限って,np.vstack(x)でも可.
ただしnp.hstack(x)では行ベクトルを作ってくれないので使わないほうがいいかも.
ただ,vstackではベクトルの長さnを取ってこなくても良いので,便利そう.
reshapeを使うと,x.reshape(x.shape[0], 1)とかx.reshape(len(x),1)みたいなことになるから・・・

numpyにarray.h()とarray.v()ってメソッド追加してくれないかなぁ

2014/10/31追記:
numpy.c_[x]でnx1に変換できるらしい。一番シンプル。
しかし、関数ではない(丸括弧じゃなくてカギ括弧!)だったり、c_に対応するr_を使って、array型のxをr_[x]としても1xnにはならなかったり、細かいところが微妙。
やっぱりarray.h()とarray.v()が欲しい

*1:matlaboctaveではベクトルは1xn行列という扱い