HOWTO · NumPy
NumPy 配列をタプルに変換する
Python で NumPy 配列をタプルに変換するために使用できる 2つの主要なメソッド、tuple()関数と map()関数があります。
このページの内容
Python 組み込みの tuple() 関数を使うと、NumPy 配列を変換できます。1次元配列では、tuple(array) によって各要素を含むタプルが作られます。2次元配列から入れ子のタプルを作るには、各行も変換します。以下の例では、どちらの形も示し、map() を使う方法も紹介します。
1次元の NumPy 配列をタプルに変換する
tuple() はイテラブルを受け取り、そこから取り出した要素をタプルに格納します。1次元の NumPy 配列を反復処理すると値が順に得られるため、そのまま tuple() に渡せば、平坦なタプルになります。次の例では NumPy の整数を使っています。表示される表現は NumPy のバージョンによって異なる場合があります。
この例を実行します。
このセクションのコードと表示されるラベルや出力は英語のままです。
import numpy as np
array = np.array([10, 20, 30])
result = tuple(array)
print(result)
(np.int64(10), np.int64(20), np.int64(30))
2次元の NumPy 配列を入れ子のタプルに変換する
2次元配列を反復処理すると、行が順に得られます。そのため、tuple(matrix) を実行すると、要素が依然として NumPy の行配列である外側のタプルが作られます。行もタプルに変換するには、各行を tuple() に渡します。これにより、結果でも元の行と列のまとまりが保たれます。
このセクションのコードと表示されるラベルや出力は英語のままです。
import numpy as np
matrix = np.array([[1, 2], [3, 4]])
result = tuple(tuple(row) for row in matrix)
print(result)
((np.int64(1), np.int64(2)), (np.int64(3), np.int64(4)))
内包表記では、各行に対して内側の変換を1回ずつ行い、最後に外側の tuple() が各行のタプルをまとめます。NumPy のスカラー値の表示は、バージョンによって異なる場合があります。
map() で各行を変換する
同じ行ごとの処理は map(tuple, matrix) でも記述できます。Python の map() はイテレーターを返すため、変換したすべての行を実体化するには tuple() で囲みます。各行に tuple() を適用するだけの処理なら、簡潔に書ける方法です。
このセクションのコードと表示されるラベルや出力は英語のままです。
import numpy as np
matrix = np.array([[1, 2], [3, 4]])
result = tuple(map(tuple, matrix))
print(result)
((np.int64(1), np.int64(2)), (np.int64(3), np.int64(4)))
ここでは map() が変換するのは各行であり、個々のスカラー値ではありません。要素ごとに値を変換する場合は、1次元配列の値を Python の整数に変換するなら tuple(int(value) for value in array) のように、別の式を使います。行を変換するのか、値を変換するのかに応じて方法を選んでください。
必要な結果に合った変換方法を選ぶ
1次元の平坦な列には tuple(array) を使います。2次元配列の各行を個別のタプルとして保つには、tuple(tuple(row) for row in matrix) のような入れ子の変換か、同等の map() を使います。どちらの方法でも、行ごとの値のまとまりが保たれます。
タプルには、shape 属性や配列演算など、NumPy 配列の性質は引き継がれません。入れ子の構造は変換後の行を反映しますが、NumPy の形状メタデータを保持するものではありません。すべての値を1つの列にしたい場合は、配列のメソッドを使って平坦化する方法もあります。平坦化すると行ごとのまとまりは失われますが、入れ子のタプルを作るために平坦化する必要はありません。
また、配列をタプルに変換しても、すべての要素が Python の組み込みスカラー型になるとは限りません。NumPy の値は、NumPy のスカラーオブジェクトのまま残る場合があります。後続のコードでその型が必要な場合に限り、実際の値に適した変換を選び、int() などで明示的に変換してください。NumPy のスカラー値の表示は、バージョンによって異なる場合があります。