Edited at

Pythonにおける多次元配列の各要素に関数を作用させる方法

この記事では、pythonの配列の各要素に対して関数を作用させるやり方を説明します。配列の各要素に対して、足したり引いたりしたいときに便利な方法です。


一次元リストの各要素に対する、関数の作用のさせ方

まず1次元リストに対するmapの使い方からはじめます。pythonのリストの各要素に1を足し合わせる、そんな状況を想定します。これはループでも記述できますし、pythonのリスト包含記法でも表現できます。しかし本記事では、リストの各要素に関数を作用させ1を足していきましょう。

varList = [1,2,3]

def addOne(var):
var = var + 1
return var

print(list(map(addOne, varList)))

とすると[2, 3, 4]が返ってきます。ちゃんと各要素に1が足されました。


多次元リストの各要素に対する関数の作用のさせ方

しかしもし、[[1,2], [3,4]]といった二次元のリスト、もしくはnumpyの二次元配列の各要素に関数を作用させたい時はどうしたらいいでしょうか?

そんなときには、numpyのvectorizeというメソッドが使えます。以下に使用例を書いてみました:


import numpy as np

varMat = [[1,2], [3,4]]
print(varMat)

def addOne(var):
var = var + 1
return var

f = np.vectorize(addOne)
varMat = f(varMat)
print(varMat)

はじめにvarMatが二次元リストとして宣言されています。そのあとに、ある変数に1を足し合わせる関数"addOne"が定義されています。そしてnp.vectorizeが呼び出されています。np.vectorizeは引数に関数(ここではaddOne)を取ります。そして引数となった関数は、np.vectorizeによって新たな関数(f)に変換されます。得られた関数(f)は、2次元配列(またはリスト)の各要素に作用し、1を足し合わせます。これで2次元配列の各要素に対して、関数を作用させることができました。多次元の扱いの場合はnp.vectorizeで、1次元の場合はmapを使います。


pandasのDataFrame型に対するmapの使い方

pandasのDataFrame型では、DataFrame型のapplymapメソッドを使って、各要素に関数を作用させます。以下に例を示します。

import pandas as pd

varMat = [[1,2],[3,4]]
df = pd.DataFrame(varMat)
dfAdded = df.applymap(lambda x:x+1)
print(dfAdded)

このコードもvarMatの各要素に1を足しています。各要素に作用させる関数をラムダ式で書いていますが、やっていることは今までのコードと同じです。


まとめ

・一次元配列にはmap(function, 配列)

・多次元にはnp.vectorize(function)(配列)

・pandasのDataFrameにはDataFrame.applymap(function)