Pythonスクリプトのコーディングで迷いがちなデータ構造の似た概念[配列, リスト, タプル]をまとめる。どれも数学的には行列みたいなものであるが、コーディング上の特徴がある。
まずは定義の仕方とそれぞれの型を見ていく。
# コード
import numpy as np
data_tuple = (0, "a", "b", 3, "d", 4, 5, "tpl") # タプル
data_list = [0, "a", "b", 3, "d", 4, 5, "lst"] # リスト
data_npt = np.array(data_list,dtype="U4") # np配列をタプルで初期化
data_npl = np.array(data_list,dtype="U4") # np配列をリストで初期化
print("") # 改行
print(f"data_tuple:{data_tuple}\n{type(data_tuple)}") #
print(f"data_list: {data_list}\n{type(data_list)}\n") #
print(f"data_npt: {data_npt}\n{type(data_npt)}") #
print(f"data_npl: {data_npl}\n{type(data_npl)}") #
実行結果は下記の通りで、タプルもしくはリストを使ってnp配列(numpyによって定義された行列)を初期化できる。※np配列のことを単に配列と呼ぶことが多い。また、このようにタプル・リストを使って配列を定義することを配列に変換するということもある。
# 実行結果
data_tuple:(0, 'a', 'b', 3, 'd', 4, 5, 'tpl')
<class 'tuple'>
data_list: [0, 'a', 'b', 3, 'd', 4, 5, 'lst']
<class 'list'>
data_npt: ['0' 'a' 'b' '3' 'd' '4' '5' 'tpl']
<class 'numpy.ndarray'>
data_npl: ['0' 'a' 'b' '3' 'd' '4' '5' 'lst']
<class 'numpy.ndarray'>
以上のようにそれぞれ型が異なるので異なる型同士では普通には演算できない。一般には配列に変換したほうが良い。配列に変換するときには、要素に文字列が含まれているので他の要素も文字列として初期化する他無い。また、型を指定しない場合であっても、勝手に文字列として初期化される。
続いて、挙動の違いを見ていく。
# コード
import numpy as np
data_u = np.array((0, "tpl"),dtype="U4") # np配列をタプルで初期化
data_str1 = np.array((0, "tpl")) # np配列をタプルで初期化
data_int32 = np.array((1, 2))
print(f"data_u: {data_u}{type(data_u[0])}") #
print(f"data_str1: {data_str1}{type(data_str1[0])}") #
print(f"data_int32:{data_int32}{type(data_int32[0])}")#
実行結果
data_u: ['0' 'tpl']<class 'numpy.str_'>
data_str1: ['0' 'tpl']<class 'numpy.str_'>
data_int32:[1 2]<class 'numpy.int32'>
代入による挙動の違い。
# コード
import numpy as np
data_tuple = (0, "a", "b", 3, "d", 4, 5, "tpl") # タプル
data_list = [0, "a", "b", 3, "d", 4, 5, "lst"] # リスト
data_npt = np.array(data_list,dtype="U4") # np配列をタプルで初期化
data_list[0] = 2
data_npt[0] = 2
data_tuple[0] = 2
実行結果:リスト・配列には再代入できるが、タプルには再代入できない。むしろ、データの書き換えが不可能なので、意図しないデータの喪失に対して優位である。
Traceback (most recent call last):
File "c:/Users/serpent/Documents/PythonScripts/study/tmp.py", line 10, in
data_tuple[0] = 2
TypeError: 'tuple' object does not support item assignment
EOF