Python 配列の形式メモ
c++とPythonを行ったり来たりしていると頭が混乱してきます。
どれがどれ?
基本は以下の3つ。
- ()がtuple
- []がlist
- {}がdict
これらに加えてnumpyのarrayとmatrixがよく使う奴らでしょう。
とりあえず名前さえわかればGoogle先生に聞くことができるので
最低限どんなオブジェクトを対象にしているのか知っておきましょう。
以下にあまりわかり易くなかったTutorialも載せておきます
Lesson 6 - Tuples, Lists, and Dictionaries
各々の違い
- list :
- tuple :要素を変更できないlist
- dict :文字通り辞書。
Pythonのこれらの配列は型の異なる値を代入可能です。
すごいけどそのせいで時々エラーを見逃しちゃったり...
あと、Printした時のnumpyのarrayとlistの出力はとても似通っています。
listのlist的表現
よく出てくるのはこういうやつらです。[({の形からどのタイプのファイルか確認できます。
私は現状、Printした時に横に並ぶのがlistで縦に並ぶのがarrayと覚えています。
[[0. 0.],[1. 1.],[2. 2.]] #こっちがlistのlist [[0. 0.] [1. 1.] [2. 2.]] # np.array
初期化と要素へのアクセス
よく使う機能をまとめます。
- 長さを取得するlen()はtuple,list,dict全てに使えます。
list
[]でアクセスします。もちろん0から。
list = [2005, 2006, 2007, 2008] #初期化 list[0] #最初の要素へのアクセス
dict
数字が名前になっただけです。
dict = {"yamada":75, "endou":82} #初期化 value = dict["yamada"] #yamadaへのアクセス
2次元配列とかの対処
以下を見てください。なんてことないでしょう?
list = [10, [20, 16], [32, 34], 18] list[1] # [20, 16] が左から2番めの要素 list[1][0] # 20 が[20,16]の1番目の要素
各種変換
実際numpy arrayとの変換とかが一番使う気もします。
まぁおいおい追記しましょう。
tuple と list 相互変換
tuple(list) list(tuple)
numpy arrayとlist 相互変換
これはよく使うと思います。
a = [1, 2] np.asarray(a) # array b = np.array([1, 2]) b.tolist() # list
参考になりそうなサイト
練 習 問 題
Q1.以下の配列の構造を答えよ
a=[(2228.739013671875, 1203.9490966796875), (2898.794189453125, 1092.8704833984375), (3060.037353515625, 852.7973022460938)
Q2.上のaを以下のbへと変換するコードを書け
print(b) [[[[ 2228.73901367 1203.94909668] [ 2898.79418945 1092.8704834 ] [ 3060.03735352 852.79730225]]]]
Ans:
b=np.array([[a]])
使用例
OpenCVでcalcOpticalFlowPyrLK()関数へとKeyPointsに渡すときに使います。
Passing ORB Features to calcOpticalFlowPyrLK - OpenCV Q&A Forum