二次元リストというリストの上位互換にあたるものを今回は扱っていきます。
二次元リストを学ぶメリットととして次の2つが挙げられます。
・画像解析では必ず使うので、画像解析やるなら必須
・データ解析の幅が広がる
最近流行りの画像解析ができるようになるためには必須の知識なので、ぜひここで学んでください!そんなに難しくありませんしね。
この記事では、pythonの二次元リストとは何か?どう取り扱うのか?までを具体的に解説していきます。
二次元リストって何?
リストが二次元になったものです。具体的には次のような、リストの中にリストが入ったものを二次元リストと呼びます。
[[1, 2, 3], [1, 2, 3], ... ]
上の例では数値しかリスト内に格納されていませんが、文字列を入れることも可能です。
二次元リストが扱えるようになると何が良いかというと、単純に扱える情報量が増えます。また、二次元リストは行列として扱えるので、行列計算も可能になります(今回は行列の話はしません)。
具体的には上の図-aのように二種類(またはそれ以上)のデータを入れることができますし、図-bのように強度分布の情報を格納できます。
二次元リストを生成する方法
二次元リストは手動でも作成できますし、numpyを利用して簡単に生成もできます。
順に見ていきましょう。
手動で二次元リストを生成する
list = [[1, 2, 3], [4, 5, 6]]
上記のように、簡単に作成できます。
リスト内の要素数が少ないときには、これで十分でしょうが数が増えたときはとても手動では対応できません。
numpyで二次元リストを生成する
import numpy as np
list = np.zeros((3, 4), dtype=float)
print(list)
# 出力結果
# [[0. 0. 0. 0.]
# [0. 0. 0. 0.]
# [0. 0. 0. 0.]]
numpyを利用すると簡単に二次元リストを生成できます。
上の例は、numpy.zeros
というメソッドを利用して、要素がすべて0のリストを生成しています。
list = np.zeros((3, 4), dtype = float)
の(3, 4)は要素数4のリストが3つ入ったリストを生成するという意味です。
dtypeは要素のデータタイプで、今回はfloatに指定しています。intにもできます。
二次元リストにデータを入れる方法
二次元リストを生成した後に、リストに好きなデータを格納(代入)することが可能です。
リスト内の特定の要素にデータを入れたい場合、一挙にデータを入れたい場合があると思います。順に見ていきましょう。
手動で格納する
import numpy as np
list = np.zeros((3, 4), dtype=float)
print(list)
# 出力結果
# [[0. 0. 0. 0.]
# [0. 0. 0. 0.]
# [0. 0. 0. 0.]]
list[0][1] = 3.0
print(list)
# 出力結果
# [[0. 3. 0. 0.]
# [0. 0. 0. 0.]
# [0. 0. 0. 0.]]
上記のように、特定の要素に値を代入したい場合は
list[行番号][列番号] = [値]
というように記述するだけOKです。
このとき、行番号と列番号は0から始まることに注意しましょう。
上の例では、list[0][1] = 3.0
と記述しているので、1行目の2列目が3.0に変更されています。
データファイルから読み込んで、リストに格納する
import numpy as np
list = np.zeros((2, 12), dtype=float)
print(list)
# 出力結果
# [[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
# [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
data_file = 'AvrgTmp_Kyoto2018.dat'
list[0], list[1] = np.loadtxt(data_file, usecols=(0,1), unpack=True)
print(list)
# 出力結果
# [[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ]
# [ 3.9 4.4 10.9 16.4 20. 23.4 29.8 29.5 23.6 18.7 13.5 8.2]]
上の例は、事前にデータファイル内のデータと同じだけの要素数のリストを生成し、そのリストに読み込んできたデータを代入しています。
代入の仕方は簡単で、
list[0] = np.loadtxt(....), list[1] = np.loadtxt(....)
とすることで、1行目と2行目それぞれに一挙にデータを代入しています。
二次元リストからデータを取り出す方法
取り出すというのは、リスト内の特定の要素をprintで表示するという意味で使っています。
これは簡単で、行番号と列番号をしていするだけで実現します。
具体例を以下に示します。
list = [[1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12.],
[3.9, 4.4, 10.9, 16.4, 20., 23.4, 29.8, 29.5, 23.6, 18.7, 13.5, 8.2]]
print(list[0])
# 出力結果
# [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]
print(list[1][6])
# 出力結果
# 29.8
リストの1行目には月のデータ、2行目には平均気温のデータが入っています。list[0]
とすることで、1行目のデータ全てを取り出すことができます。
また、7月の平均気温を取り出したいとすると、上にもあるようにlist[0][6]
とすることで特定のデータを取り出すことが可能です。