[英]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])
問題是您沒有像對象一樣進行比較。 注釋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.