2017-08-10 54 views
1

需要使用.npy擴展加載多個文件,並將其中的內容寫入新數組。幾個文件的np.load

爲什麼代碼不起作用?我應該改進什麼?

A = np.empty(0) 
for file in files: 
    inf_from_every_file = np.load(file) 
    A = np.append(A, inf_from_every_file) 
+0

'files'的內容是什麼,你得到的錯誤是什麼?另外,如果你有多個文件的內容要連接成一個大數組,你可能會發現將每個加載的數組附加到一個列表中,然後用['np.concatenate'](https:// docs。 scipy.org/doc/numpy-1.11.0/reference/generated/numpy.concatenate.html)。 – jdehesa

+0

在這樣的循環中使用'np.append'很慢,很難獲得正確的起始值。 'np.empty(0)'不等於列表'[]'。堅持列表追加方法,並處理循環後將這些數組合併成一個。 – hpaulj

回答

0

正如已指出了意見,目前尚不清楚你所說的意思是「不工作」。由於files包含文件名或路徑('a_file.npy'),並且假設這些文件在當前工作目錄中或在給定路徑中實際存在,您的代碼應該「工作」。

但是,您的代碼會因爲它將flatten加載的數組並將它們一起追加到一個大的1D數組中。這很可能不是你想要的,所以我會認爲這是你的問題。

要解決這個問題,您需要查看axis關鍵字np.append

但是,在循環中追加numpy數組通常是個壞主意,因爲在每個append期間都會創建一個完整的數組副本。因此,您應該用一個列表,其後np.concatenate堅持:

A = [] 
for fname in files: 
    inf_from_every_file = np.load(fname) 
    A.append(inf_from_every_file) 
A = np.concatenate(A) 

...或者你應該初始化從一開始就對整個空數組,然後通過索引值添加到它:

A = np.empty((len(files),) + np.load(files[0]).shape) 
for index,fname in enumerate(files): 
    A[index,...] = np.load(fname) 

請注意,如果您不知道應該加載的數組的形狀,則初始化行A會變得有點複雜。在這裏,我從列表中加載第一個數組以獲取形狀信息。如果你已經知道形狀是例如(100,100),你可以改爲使用

A = np.empty((len(files), 100, 100))