儲存和分享你的 NumPy 陣列#

您將學到什麼#

您將把 NumPy 陣列儲存為壓縮檔案和人類可讀的逗號分隔檔案,即 *.csv。您還將學習如何將這兩種檔案類型載入回 NumPy 工作區。

您將會做什麼#

您將學習兩種儲存和讀取檔案的方式:壓縮檔案和文字檔案,這將滿足您在 NumPy 中的大部分儲存需求。

  • 您將建立兩個一維陣列和一個二維陣列

  • 您將這些陣列儲存到檔案中

  • 您將從工作區中移除變數

  • 您將從儲存的檔案中載入變數

  • 您將比較壓縮二進位檔案和人類可讀的分隔檔案

  • 您將具備儲存、載入和分享 NumPy 陣列的技能

您將需要什麼#

  • NumPy

  • 對您工作目錄的讀寫權限

使用以下指令載入必要的函式。

import numpy as np

在本教學中,您將使用以下 Python、IPython 魔法函式和 NumPy 函式


建立您的陣列#

現在您已匯入 NumPy 函式庫,您可以建立幾個陣列;讓我們從兩個一維陣列 xy 開始,其中 y = x**2。您將使用 np.arangex 指派給從 0 到 9 的整數。

x = np.arange(10)
y = x ** 2
print(x)
print(y)
[0 1 2 3 4 5 6 7 8 9]
[ 0  1  4  9 16 25 36 49 64 81]

使用 NumPy 的 savez 儲存您的陣列#

現在您的工作區中有兩個陣列:

x: [0 1 2 3 4 5 6 7 8 9]

y: [ 0  1  4  9 16 25 36 49 64 81]

您首先要做的是使用 savez 將它們儲存到一個檔案中,作為壓縮的陣列。您將使用兩個選項來標記檔案中的陣列:

  1. x_axis = x:此選項將名稱 x_axis 指派給變數 x

  2. y_axis = y:此選項將名稱 y_axis 指派給變數 y

np.savez("x_y-squared.npz", x_axis=x, y_axis=y)

使用 NumPy 的 load 移除已儲存的陣列並重新載入它們#

在您目前的工作目錄中,應該有一個名為 x_y-squared.npz 的新檔案。這個檔案是兩個陣列 xy 的壓縮二進位檔。讓我們清除工作區並重新載入這些值。這個 x_y-squared.npz 檔案包含兩個 NPY 格式 的檔案。NPY 格式是一種 原生二進位格式。您無法在標準文字編輯器或試算表中讀取這些數字。

  1. 使用 del 從工作區中移除 xy

  2. 使用 np.load 將陣列載入到工作區的字典中

要查看工作區中有哪些變數,請使用 Jupyter/IPython 的「魔術」指令 whos

del x, y
%whos
Variable   Type      Data/Info
------------------------------
np         module    <module 'numpy' from '/ho<...>kages/numpy/__init__.py'>
load_xy = np.load("x_y-squared.npz")

print(load_xy.files)
['x_axis', 'y_axis']
%whos
Variable   Type       Data/Info
-------------------------------
load_xy    NpzFile    NpzFile 'x_y-squared.npz'<...>with keys: x_axis, y_axis
np         module     <module 'numpy' from '/ho<...>kages/numpy/__init__.py'>

將 NpzFile 陣列重新賦值給 xy#

您現在已經建立了一個包含 NpzFile 類型資料的字典。其中包含您在 savez 命令中定義的檔案 x_axisy_axis。您可以將 load_xy 檔案重新賦值給 xy

x = load_xy["x_axis"]
y = load_xy["y_axis"]
print(x)
print(y)
[0 1 2 3 4 5 6 7 8 9]
[ 0  1  4  9 16 25 36 49 64 81]

成功#

您已使用 savezload 成功建立、儲存、刪除和載入變數 xy。做得很好。

另一種選擇:儲存為人類可讀的 csv 檔案#

讓我們考慮另一種情況,您想與其他人或其他程式共享 xy。您可能需要易於共享的人類可讀文字檔案。接下來,您可以使用 savetxtxy 儲存到逗號分隔值檔案 x_y-squared.csv 中。產生的 csv 檔案由 ASCII 字元組成。您可以將檔案重新載入 NumPy 或使用其他程式讀取它。

將資料重新排列成單個二維陣列#

首先,您必須從兩個一維陣列建立一個二維陣列。csv 檔案類型是一種試算表樣式的資料集。csv 檔案將數字排列成列(以換行符號分隔)和欄(以逗號分隔)。如果資料更複雜,例如多個二維陣列或更高維度的陣列,則最好使用 savez。在這裡,您將使用兩個 NumPy 函式來格式化資料:

  1. np.block:此函式將陣列附加在一起成為一個二維陣列。

  2. np.newaxis:此函式將一維陣列強制轉換為具有 10 列和 1 欄的二維欄向量。

array_out = np.block([x[:, np.newaxis], y[:, np.newaxis]])
print("the output array has shape ", array_out.shape, " with values:")
print(array_out)
the output array has shape  (10, 2)  with values:
[[ 0  0]
 [ 1  1]
 [ 2  4]
 [ 3  9]
 [ 4 16]
 [ 5 25]
 [ 6 36]
 [ 7 49]
 [ 8 64]
 [ 9 81]]

使用 savetxt 將資料儲存到 csv 檔案#

您可以使用帶有三個選項的 savetxt,使您的檔案更易於閱讀:

  • X = array_out:此選項指示 savetxt 將您的二維陣列 array_out 儲存到檔案 x_y-squared.csv

  • header = 'x, y':此選項在任何資料之前寫入一個標題,用於標記 csv 檔案的欄位。

  • delimiter = ',':此選項指示 savetxt 在檔案的每一欄之間放置一個逗號。

np.savetxt("x_y-squared.csv", X=array_out, header="x, y", delimiter=",")

開啟檔案 x_y-squared.csv,您將看到以下內容

!head x_y-squared.csv
# x, y
0.000000000000000000e+00,0.000000000000000000e+00
1.000000000000000000e+00,1.000000000000000000e+00
2.000000000000000000e+00,4.000000000000000000e+00
3.000000000000000000e+00,9.000000000000000000e+00
4.000000000000000000e+00,1.600000000000000000e+01
5.000000000000000000e+00,2.500000000000000000e+01
6.000000000000000000e+00,3.600000000000000000e+01
7.000000000000000000e+00,4.900000000000000000e+01
8.000000000000000000e+00,6.400000000000000000e+01

我們的陣列以 CSV 檔案呈現#

這裡有兩個您應該注意的特點

  1. NumPy 使用 # 在使用 loadtxt 時忽略標題。如果您將 loadtxt 與其他 CSV 檔案一起使用,您可以使用 skiprows = <標題列數> 跳過標題列。

  2. 整數以科學記號法寫入。*您可以*使用 savetxt 選項 fmt = 指定文字的格式,但它仍然會以 ASCII 字元寫入。一般來說,您無法將 ASCII 數字的類型保留為 floatint

現在,再次刪除 xy,並將它們指定給 x-y_squared.csv 中的欄位。

del x, y
load_xy = np.loadtxt("x_y-squared.csv", delimiter=",")
load_xy.shape
(10, 2)
x = load_xy[:, 0]
y = load_xy[:, 1]
print(x)
print(y)
[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
[ 0.  1.  4.  9. 16. 25. 36. 49. 64. 81.]

成功了,但請記住您的類型#

當您將陣列儲存到 CSV 檔案時,您沒有保留 int 類型。將陣列載回您的工作空間時,預設程序會將 CSV 檔案載入為二維浮點數陣列,例如 load_xy.dtype == 'float64'load_xy.shape == (10, 2)

總結#

總之,您可以在 NumPy 中建立、儲存和載入陣列。儲存陣列使分享您的工作和協作變得更加容易。Python 還有其他方法可以將資料儲存到檔案,例如 pickle,但 savezsavetxt 將分別滿足您未來 NumPy 工作和與他人分享的大部分儲存需求。

後續步驟:您可以從 使用 genfromtext 匯入 匯入具有缺失值的資料,或透過 讀寫檔案 了解更多關於一般 NumPy IO 的資訊。