Translate

【len()】pythonでforループを行列データでうまく使う方法【numpy】

いろいろと仕事で行列データを使っていると、同じコードを何回も書いている箇所が出てきて、全体のpythonコードの長さが冗長になってしまうことが多いです。そういった場合に役に立つのがfor文になります。


for 文はpythonに限らず、他のプログラミング言語でも使われていますが、pythonはインテンドで区切る性質上、他のプログラミング言語よりもfor文を可視化しやすいといえます。

今回は、行列データを扱うときに使うpython のfor文について、簡単な例を交えながら紹介していこうと思います。


numpy行列を扱うfor文の場合にはlen()を使うのが便利



Excelデータとかテキストファイルのデータの解析でnumpyを使った処理をする場合には、たいてい複数行もしくは複数列のデータ配列のデータを読み込むのが多いでしょう。

そういった行列データ全体に対してfor文を書きたい場合には、for文のループ回数の指定の際にlen()を使うのが便利です。

len()はデータの長さを取得するpythonの関数の一つですが、numpyの行列データに使用すると、行数であったり、列数を簡単に取得することができます。

例を挙げるとこんな感じです。

import numpy as np
import numpy as np
data = np.array([1,2,3,3,4,4,5])
#ここは入れたいデータ

for i  in range (len(data)) :
    data[i] = data[i]+1
    #ここは実際に行列の一つにやりたい計算処理


for文を使えば複数ファイルも処理できる

めちゃくちゃ簡単な例ではありますが、この場合だと、行列dataのデータの中身の数を数えて、データ長を取得。for文の中でlen()を使ってループ回数を指定する(この場合はi=0~6)でループ毎に入る。そして計算処理として、dataのi行目のデータに対して加算処理を行う。といった流れになる。

もっと実用的な例でいくとこういったfor文もnumpyを使ったテキストファイルのfor文処理でよく使います。

import numpy as np
import pandas as pd
import glob data_filename = glob.glob('*.csv')
result = np.zeros([0,1])
for t in range(len(data_filename)):
	data = pd.read_table(data_filename[t],sep = ',')  #以下やりたい計算処理    
    data2 = data[1,1]     
    result = np.vstack([result,data2])
    

この文ではどういったことを言っているかというと、まずはgrob.grob関数というもので、同じディレクトリ(俗っぽく言うと、スクリプトファイルのあるフォルダ)の中にあるcsvファイルのファイル名をすべて取得して、リストとしてdata_filenameという変数の中に入れるという処理を行っています。

そのあとlen(data_filename)により同じディレクトリ内にあるファイル名の数を取得してループ回数を決めます。

そして、ループ回路の中では、pandasというモジュールを使ってcsvファイルを読み込みます。具体的にいうと、data_filenameの変数の中のi行目のデータファイル名を開くという感じの処理なります。これ以降のループの中で行いたい計算処理を書いていって、取得した計算結果が得られたらループ外の変数に遂次追加して保存していくといった処理を加えていくことで、一度のスクリプトの実行で複数ファイルの処理を同時に行うことができます。

参考までにいうと先ほどのコードでいうと、ループ外にresultという空の配列を作っておいて、そこにループ内での結果をnp.vstack()関数を使ってループ外に保存していくといったことになります(ループで変数が更新されるまでにループ外の別の所で保存するといったイメージ)。

こういった書き方に慣れてしまえば、コードの行数も減らすことができるし非常に楽になります。ただし欠点としてはpythonのfor文はかなり遅くなるので、あまり長い行数のデータ処理などの場合には時間がかかるので、行列とかベクトルで一気に処理するような工夫が必要になるかもしれません。