2017-04-13 58 views
1

我想連接很多numpy數組,我把每個數組放在一個文件中,其實問題是我有很多文件,內存不支持創建一個大數組Data_Array = np.zeros((1000000,7000)),在那裏我會把所有的文件。如何連接許多numpy數組?

file1= np.load('file1_Path.npy') 
file2= np.load('file2_Path.npy') 
file3= np.load('file3_Path.npy') 
file4= np.load('file4_Path.npy') 
dataArray=np.concatenate((file1, file2, file3, file4), axis=0) 
test= dataArray.shape 
print(test) 
print (dataArray) 
print (dataArray.shape) 
plt.plot(dataArray.T) 
plt.show() 

這種方式給了我一個非常好的結果,但現在,我需要的路徑替換file1, file2, file3, file4到我的文件夾:

所以,我在這個問題 Combining NumPy arrays,我可以使用 np.concatenate發現 ​​

它給我這個錯誤:

np.concatenate(npfile, axis=0) 

ValueError: zero-dimensional arrays cannot be concatenated 

能否請你幫我做這個方法np.concatenate作品?

+0

您是否嘗試保存並讀取HDF5文件中的數據?它支持流式傳輸數據 –

+0

@NilsWerne,非常感謝您的回答,但我不嘗試HDF5文件,因爲我的目標是有一個大的numpy文件,它包含我所有的文件,這個文件將幫助我做可能分析。 – Guillaume

+0

如果您添加某種「真理測試」,例如'如果npfile:np.concatenate(npfile,axis = 0)'...也就是說,如果npfile不是None ...你也可以使用try-except塊來傳遞ValueError。 – blacksite

回答

0

如果您希望使用大型數組,只需使用np.memmap,而不是將數據加載到內存中。 memmap的優點是,必要時數據總是保存到磁盤。例如,您可以按以下方式創建內存映射陣列:

import numpy as np 

a=np.memmap('myFile',dtype=np.int,mode='w+',shape=(1000000,8000)) 

然後,您可以使用'a'作爲正常的numpy數組。 這個限制就是你的硬盤!這將在您的硬盤上創建一個文件,以供您稍後閱讀。您只需將模式更改爲'r'並從數組中讀取數據。 約MEMMAP這裏更多信息:https://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html

爲了填補形狀(1,8000)的NPY文件陣列,只寫:

for i,npFile in enumerate(npfFiles): 
    a[i,:]=np.load(npFile) 
a.flush() 

沖洗方法確保一切都已經寫在磁盤

+0

通過使用此方法,我創建了一個帶有形狀(1000000,8000)的數組,但是如何將我的numpy文件保存在該文件的文件夾中? – Guillaume

+0

他們有相同的形狀和類型嗎? – ma3oun

+0

其實每個文件的形狀都是(1,8000),它們是一個numpy文件,我想把它們全部放在同一個文件中,所以爲了有一個正確的工作,結果文件必須有形狀(1000000 ,8000),我有百萬numpy文件輸入。 – Guillaume