粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

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] #最初の要素へのアクセス

リストオブジェクト - リスト - Python入門

tuple

listに準じます。

tuple = (2005, 2006, 2007, 2008) #初期化
tuple[0] #最初の要素へのアクセス

タプル - Python入門

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