HOWTO · NumPy

將 NumPy 陣列轉換為元組

有兩種主要方法可用於將 NumPy 陣列轉換為 Python 中的元組,即 tuple() 函式和 map() 函式。

本頁內容

使用 Python 內建的 tuple() 函式轉換 NumPy 陣列。一維陣列可用 tuple(array) 建立包含各元素的元組。若要將二維陣列轉成巢狀元組,也要逐列轉換。以下範例展示這兩種維度的結果,以及 map() 這種替代寫法。

將一維 NumPy 陣列轉換為元組

tuple() 會消耗可迭代物件,並將其產生的項目放入元組。一維 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))

將二維 NumPy 陣列轉換為巢狀元組

迭代二維陣列時會逐列產生資料。因此,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)))

推導式會為每一列執行一次內層轉換,再由外層的 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() 會轉換各列,而不是各個純量值。若要逐一轉換元素值,例如將一維陣列的值轉成 Python 整數,可改用 tuple(int(value) for value in array) 這類寫法。該選擇取決於你要轉換的是列還是值。

選擇符合所需結果的轉換方式

若要取得一維扁平序列,使用 tuple(array)。若是二維陣列,且希望每一列各自保留為一個元組,可使用 tuple(tuple(row) for row in matrix) 這類巢狀轉換,也可以使用等效的 map() 寫法。這些方式都會保留各列之間的分組。

元組不會保留 NumPy 陣列的屬性,例如 shape 屬性或陣列運算。巢狀結構會反映轉換後各列的排列,但不會保留 NumPy 的形狀中繼資料。如果你的工作需要將所有值合併成一個序列,可以選擇使用陣列方法攤平;這會捨棄列分組並改變資料結構。建立巢狀元組不需要先攤平。

此外,將陣列轉成元組不保證每個項目都會變成原生 Python 純量。NumPy 的值可能仍是 NumPy 純量物件。只有在下游程式需要特定型別時,才使用 int() 等明確轉換,並依實際值選擇合適的轉換方式。NumPy 純量的顯示方式可能因版本而異。