NumPy中的結構化陣列


NumPy是Python中用於科學計算的基本包,它提供了強大的工具來處理同構多維陣列。雖然NumPy陣列擅長高效地處理統一資料型別,但在某些情況下,我們需要處理包含異構型別的資料。這就是結構化陣列發揮作用的地方。

NumPy中的結構化陣列允許我們處理表格資料或結構化資料,其中陣列的每個元素都可以具有多個不同資料型別的欄位。此功能使NumPy成為處理各種資料的通用庫,包括CSV檔案、資料庫表等等。

建立結構化陣列

要在NumPy中建立結構化陣列,我們需要定義一個dtype(資料型別),它指定每個欄位的名稱和型別。讓我們考慮一個示例,我們希望表示一個學生記錄的資料集,其中包含姓名、年齡和成績等欄位。以下是我們可以為這樣的結構化陣列定義dtype的方式:

import numpy as np

dtype = np.dtype([('name', 'U20'), ('age', np.int32), ('grade', np.float64)])

在這個例子中,我們定義了一個包含三個欄位的dtype:“name”為長度為20個字元的Unicode字串,“age”為32位整數,“grade”為64位浮點數。

現在,我們可以使用此dtype建立一個結構化陣列:

data = np.array([('Alice', 25, 4.8), ('Bob', 23, 3.9), ('Charlie', 27, 4.5)], dtype=dtype)

資料陣列是一個包含三個元素的結構化陣列,每個元素都具有“name”、“age”和“grade”欄位及其各自的值。

操作結構化陣列

除了訪問和修改各個欄位外,NumPy中的結構化陣列還提供各種方法來整體操作資料。讓我們探索一些常見的操作:

排序

我們可以使用np.sort()函式根據一個或多個欄位對結構化陣列進行排序。例如,讓我們根據“age”欄位以降序對data陣列進行排序:

示例

sorted_data = np.sort(data, order='age')[::-1]
print(sorted_data)

輸出

[('Charlie', 27, 4.5) ('Alice', 25, 4.8) ('Bob', 24, 3.9)]

聚合

NumPy提供了一些聚合函式,例如np.mean()、np.sum()和np.max(),這些函式可用於計算結構化陣列的統計資料。這是一個計算平均年齡和最高成績的示例:

average_age = np.mean(data['age'])
maximum_grade = np.max(data['grade'])
print(average_age)  # Output: 25.0
print(maximum_grade)  # Output: 4.8

過濾

我們可以使用布林索引根據某些條件過濾結構化陣列。例如,讓我們過濾年齡小於26歲的學生:

示例

filtered_data = data[data.age < 26]
print(filtered_data)

輸出

[('Alice', 25, 4.8) ('Bob', 24, 3.9)]

連線

我們可以使用np.concatenate()函式水平或垂直連線多個結構化陣列。例如,讓我們建立一個另一個結構化陣列並將其與data陣列垂直連線:

示例

new_data = np.array([('David', 28, 4.3), ('Eve', 22, 3.7)], dtype=dtype)
concatenated_data = np.concatenate((data, new_data))
print(concatenated_data)

輸出

[('Alice', 25, 4.8) ('Bob', 23, 3.9) ('Charlie', 27, 4.5) ('David', 28, 4.3) ('Eve', 22, 3.7)]

重塑

我們可以使用np.reshape()函式重塑結構化陣列。例如,讓我們將data陣列重塑為一個2x3的陣列:

示例

reshaped_data = np.reshape(data, (2, 3))
print(reshaped_data)

輸出

[[('Alice', 25, 4.8) ('Bob', 23, 3.9) ('Charlie', 27, 4.5)]
 [('David', 28, 4.3) ('Eve', 22, 3.7) ('', 0, 0.0)]]

這些只是您可以對結構化陣列執行的操作的幾個示例。NumPy提供了一套豐富的函式和方法,可以高效地操作和分析結構化資料。

結構化陣列的用例

結構化陣列在涉及表格資料或結構化資料的場景中特別有用。一些常見的用例包括:

資料匯入/匯出

當處理來自CSV檔案或資料庫等外部來源的結構化資料時,我們可以使用結構化陣列來高效地讀取、操作和處理資料。

資料分析

結構化陣列提供了一種方便的方法來執行各種資料分析任務。我們可以使用它們根據不同的欄位過濾、排序、分組和聚合資料,使我們能夠從資料中獲得見解並提取有意義的資訊。

模擬和建模

在科學模擬或建模任務中,結構化陣列可用於表示不同的變數或引數。這允許我們高效地組織和操作資料,促進複雜的計算和模擬。

記錄儲存和資料庫

結構化陣列對於記錄儲存應用程式或處理小型資料庫非常有用。它們提供了一種有組織且高效的方式來儲存、查詢和修改具有多個欄位的記錄。

廣播和向量化運算

NumPy的廣播和向量化運算可以無縫地應用於結構化陣列。這允許對多個欄位同時進行高效的逐元素計算和操作。

例如,假設我們有一個結構化陣列表示溫度資料集,其中包含“temperature_celsius”和“temperature_fahrenheit”等欄位。我們可以使用廣播輕鬆地將溫度從攝氏度轉換為華氏度:

data['temperature_fahrenheit'] = data['temperature_celsius'] * 9/5 + 32

記憶體效率

NumPy中的結構化陣列記憶體效率高,因為它們將資料儲存在連續的記憶體塊中。與其他資料結構相比,這會導致更快的訪問速度和效能提升。

需要注意的是,如果結構化陣列包含長度不同的大型欄位(例如字串欄位),則結合使用NumPy的**object**資料型別或使用pandas等專門的庫來更有效地處理記憶體可能更有效。

自定義資料型別

NumPy允許定義具有使用者定義欄位的自定義資料型別。此功能支援在結構化陣列中靈活表示複雜的資料結構,例如巢狀陣列、分層資料甚至自定義物件。

例如,讓我們考慮一個表示員工記錄的結構化陣列,其中包含名為“projects”的欄位,該欄位包含每個員工的專案名稱列表。我們可以定義一個自定義資料型別來處理此巢狀結構。

與其他庫的整合

NumPy中的結構化陣列與Python中其他流行的資料操作和分析庫(例如pandas、scikit-learn和matplotlib)無縫整合。這種互操作性允許在資料科學生態系統中的不同工具之間進行順暢的資料交換和相容性。

例如,您可以使用pd.DataFrame()建構函式將結構化陣列轉換為pandas DataFrame,以進行高階資料分析、視覺化和機器學習任務。

效能注意事項

雖然結構化陣列提供了靈活性和便利性,但對於極其龐大的資料集或複雜的資料操作,它們可能不是最有效的選擇。在這種情況下,pandas或資料庫等專用庫可能會提供更好的效能和可擴充套件性。

重要的是要考慮結構化陣列的大小、操作的複雜性和資料分析任務的具體要求,以確定最合適的方法。

結論

總之,NumPy中的結構化陣列使您能夠高效有效地處理結構化資料。透過利用結構化陣列的靈活性和功能,您可以輕鬆地處理複雜的資料操作、分析和建模任務。因此,深入瞭解結構化陣列的世界,並在您的Python專案中釋放結構化資料處理的全部潛力!

更新於:2023年8月14日

2K+ 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告