こんな人に読んでもらいたい記事です.
・numpy二次元配列の操作の参考になる情報が欲しい!
・pythonでの配列操作のコツを知りたい!
という人
結論
・pythonでのnumpy二次元配列操作で悪戦苦闘したので,その備忘録を記事にします.
・やりたいこと:「複数の配列から任意の列を抽出,合体して新しい配列を作る」
配列の処理ってめんどくさい
こんにちはりゅういえんじにあです.
今回は業務で実験データをpythonを使って整理する過程で
配列操作のコーディングで悪戦苦闘しましたので,
そのときの記録を整理しました.
※なおこの記事はpython初心者のりゅういえんじにあが
CやC++との差に悪戦苦闘した結果を書いています.
もしかしたらもっと最適な方法があるかもしれません.
「複数の配列から列を抽出して合体」は意外とめんどくさかった
今回実験データを整理する過程でやりたかったことは
「複数のnumpy行列から指定の列を抽出して1つの行列にする」
です.
というのは,実験では複数の結果ファイル(時間-計測値)のが生成されるのですが,
その検証のために時間と計測値のデータを1つにまとめたかったからです.※
調べてみると
「1つのnumpy行列から必要な行を抽出し,新しい配列を作る」
といったことはコマンドの工夫でできるようです.
ただ,「複数のnumpy行列から指定の列を抽出して1つの行列にする」が
意外とすんなりできず悪戦苦闘しました.
・データをまとめるのは例えばエクセルでペタペタ貼り付けるという古典的な方法があります.
・実験で取得したデータは往々にして容量が大きく,
データの一部を切り取って必要な列だけ貼り付けるだけで
エクセルがフリーズすることが結構あるんですよね
・だからpythonを使ってデータをまとめようとしています.
「複数の配列から列を抽出して合体」具体的な操作
ここからは「複数の配列から列を抽出して合体」
する具体的な流れを紹介します.
まずまとめとしては3ステップになっています.
以下にそれぞれの流れを説明します.
(1)それぞれの配列から必要な列を抽出した配列を作る
上記で示した通り「1つのnumpy行列から必要な行を抽出し,新しい配列を作る」のは
コマンドの工夫で簡単にできます.
例えば,抽出元の配列「Base_array01」から必要な列を抽出し,「Temp_array01」を作るときは
Temp_array01 = Base_array01[: , [0, 1, 2, N]]
で作れます.(0,1,2,N行目を抽出の意味)
(2)「numpy.append()」関数で必要な配列を合体する
「pythob 配列 追加」などのワードで検索すると比較的容易に出てくる
「append()」関数で必要な配列を合体します.
ここで注意なのは二次元配列を単純にappend関数で処理しても
最終的に一次元配列になってしまうところです.
りゅういえんじにあもここで苦労しました.
もしかしたら,パラメータを正確に設定することによって
append関数でも二次元配列のまま追加できるのかも…
記事を書き終えて気づきましたが,
append関数のパラメータ「axis」によって
配列の設定方法ができたみたいです.
(当方の勉強不足です)「axis=0」:新たな行として追加(縦に連結)
「axis=1」:新たな列として追加(横に連結)ただ,配列(行や列)を追加するとき,
第一引数と第二引数の次元数が一致していないとエラーになってしまうので,
よくわからないときは素直にappendして
改めて(3)の手順をしたほうがよいかも
(3)「numpy.reshape()」関数で必要な形の二次元配列に戻す
最後に「numpy.reshape()」関数で必要な形の二次元配列に戻します.
(2)の手順では
「時刻0のときのデータ」,「時刻1のときのデータ」…
と続く一次元配列が出来上がります.
ここではそれをちょうど良い位置で区切って,
「時間の列」「データ1の列」「データ2の列」…
となっている二次元配列にする必要があります.
そのときに使う関数が「numpy.reshape()」です.
例えばnumpy.reshape([3,4])で
3×4の配列になります.
※当たり前ですがこのとき要素が12個ないとエラーになります.
また,パラメータ「order」で一時的配列の要素を
縦方向に並べるのか(C),横方向に並べるのか(F)が変わります.
詳しくは検索ください.
変形する行の数はもともとの配列の数に合わせればよいので,
「.shape(0)」で取得できます.
※「.shape(1)」:列の数
おわりに
今回,自分が業務で実験データを整理する上で
pythonのコーディングで困ったことを
整理してみました.
記事を書きながら改めて調べると,
やりたい操作をするためのオプションがちゃんと
存在することがわかったりしました.
あるあるですね.
突き詰めればこの記事のようにまどろっこしい操作をする必要はないのかもしれませんが,
pythonが初めてで同様の課題にぶち当たった人の参考になれば嬉しいです.
自分でいろいろやってみても難しい!という人は
プログラミングスクールを検討してみても良いかもしれません
ありがとうございました.
コメント