numpyを使っていろいろとやってみると二次元配列が非常に便利に感じてきます。一歩ステップアップした先には三次元配列があるのですが、こちらについては甘味も最近使い始めたばかり、まだいまだに慣れることができていません。
ただ、三次元配列のデータってnpyファイルかnpzファイル、もしくMATLABとの互換を持たせるのであればmatファイルで保存するのがメジャーだと思います。
これらのファイルはそれはそれで便利なのですが、Excelとかでデータを見るとかといったのにはあんまり向いていない気がします。また場合によっては三次元配列よりも二次元配列の方が見やすい場合もあるのではないかと思います。
そこで今回は、pythonでの三次元配列を二次元配列に変換しなおす方法について、備忘録として残しておこうと思います。もちろん使うのはnumpyになります。
numpyを使った三次元配列から二次元配列の変換はforループを使う
では一体、numpyを使って三次元配列を二次元配列に戻すにはどのような方法を使うのが良いのでしょうか。
個人的に一番イメージしやすく、かつ簡単だったのが、forループを使った方法でした。
実際に使ったコードがこちらになります。例としましては、(10,3,複数行)の三次元配列dataを使ってみましょう。
#必要なパッケージのインポート
import numpy as np
import glob
#ファイルの読み込み(三次元配列のnpyファイル)
filename = glob.glob('*.npy')
data = np.load(filename[0])
#二次元配列として座標データを配列し直すための空配列
res = np.zeros([len(data[0,0,:]),0])
for x in range(0,10):
#二次元配列の取り出し(転置が必要な場合は.Tを加える)
data = posdata[x,:,:].T
#取り出した二次元配列を列方向につなぎ合わせる
res = np.hstack((res,data))
書いてみるとこんな感じです。pythonでは割とあっさりとかけているのではないでしょうか。実際にこのデータをcsvに保存して、中身をExcelのソフトウェア上からもみることができます。
逆に二次元配列から三次元配列にする場合には、numpyのnp.vstack()を使う
では逆のパターンで二次元配列から三次元配列にnumpyで変換する場合にはどのような方法を使えばよいのでしょうか?
numpyには三次元配列としてデータをつなぎ合わせるための関数がはいっています。それがnp.vstack()になります。基本的にはこれを使うのが良いでしょう。
サンプルコードはこちらになります。
#必要なパッケージのインポート
import numpy as np
import glob
#ファイルの読み込み(三次元配列のnpyファイル)
filename = glob.glob('*.csv')
num = 10
res = np.zeros([10,10])
for x in range (1,10):
data = np.genfromtxt(filename[x],delimiter-',')
res = np.dstack((res,data))
コードはこんな感じになります。基本的には一次元から二次元配列にする時とほとんど代わりません。このコードの想定シチュエーションは、10列10行で入っているcsvデータを三次元配列として一つにまとめるといった感じです。