簡體   English   中英

將數組存儲在h5py數據集中時,尺寸是否更改?

[英]When storing array in h5py dataset the dimensions is changed?

我有一個包含3d數組和標簽的2d列表,我嘗試使用兩個數據集(數據和標簽)將數據保存在h5py文件中,一個數據集用於3d數組,另一個數據集用於標簽,但是在顯示“ data”的內容時存儲3d數組的數據集顯示的結果是4d數組。 我創建h4py文件的代碼:

Data_set = get3Dmatrix(ID_list) # 2d list
data = []
label = []
for i in range(len(Data_set)):
    data.append(Data_set[i][0])
    label.append(Data_set[i][1])

label = [int(i) for i in labels]#convert label to int

with h5py.File(output_path+'dataset.h5', 'w') as hf:
    hf.create_dataset('data', data=data, compression='lzf')
    hf.create_dataset('label', data=label, compression='lzf')
print("Creating h5py file is completed")
print("%s time takes in seconds" % (time.time() - start_time))

if __name__ == "__main__":
    main()

我的代碼用於顯示3d數組數據集的內容:

hf = h5py.File(output_path+'dataset.h5', 'r')
dt = hf.get('data')
lbl = hf.get('label')
print(dt[0:1])

我的2d列表的內容如下圖所示: 在此處輸入圖片說明

顯示時得到的數組如下圖所示: 在此處輸入圖片說明

問題是您沒有像對象一樣進行比較。 注釋the content of my 2d list is like the image below意味着您希望您的HDF5文件能夠反映您的列表或數組。 但是在您的代碼中,您將數組列表轉換為單個NumPy數組,然后再分配給HDF5數據集。 這是相關的行:

data = np.array(data)

讓我們看一些示例數據發生的最小示例:

arr1 = np.array([[1, 2, 3],
                 [4, 5, 6],
                 [7, 8, 9]])

arr2 = np.array([[10, 11, 12],
                 [13, 14, 15],
                 [16, 17, 18]])

現在,讓我們從這些單個數組創建一個數組列表。 如您所見,列表中有兩個2d數組:

L = [arr1, arr2]

print(L)

[array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]]),
 array([[10, 11, 12],
       [13, 14, 15],
       [16, 17, 18]])]

當我們轉換為NumPy數組時會發生什么? NumPy折疊列表結構,並生成一個同質類型的NumPy數組,現在可以將其保存在連續的內存塊中。 沒有涉及列表指針。 這正是您應該期望的。

A = np.array(L)

print(A)

array([[[ 1,  2,  3],
        [ 4,  5,  6],
        [ 7,  8,  9]],

       [[10, 11, 12],
        [13, 14, 15],
        [16, 17, 18]]])

您的輸入數組具有2維,因此NumPy將此類數組的列表轉換為3維的單個數組似乎是完全合理的。 如果需要二維數組,則必須指示NumPy 如何組合多個數組。 例如,使用numpy.vstack

B = np.vstack(L)

print(B)

array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12],
       [13, 14, 15],
       [16, 17, 18]])

我可能會重復@jpp的答案,但是我需要寫出詳細信息以了解發生了什么。

如果我正確地理解了問題,則Data_set是一個成對的列表(列表),每個對都由一個3d數組和一個字符串組成。

此循環將其分為2個列表:

data = []
label = []
for i in range(len(Data_set)):
    data.append(Data_set[i][0])
    label.append(Data_set[i][1])

或者它可以寫成

data = [a[0] for a in Data_set]
label = [a[1] for a in Data_set]

甚至

data, label = list(zip(*Data_set))

保存data

hf.create_dataset('data', data=data, compression='lzf')

h5py將其轉換為數組(只能保存np.array源)。

np.array(data).shape 這將是4天。 這看起來像是3d數組(大小相同)的邏輯數據結構。

可以將其轉換為3d數組的列表,例如list(dt)

您可以先執行data = np.concatenate(data, axis=0) 那將產生一個3d數組,但是隨后您將松開原始3d數組之間的所有邊界。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM