2017-10-17 32 views
0

我需要從文件夾中讀取圖像文件(28 * 28)並將它們堆疊在一起以製作單個數組進行分析。添加2d數組以在python中製作3d

我有以下代碼:

for fname in os.listdir(dirname): 
    im = Image.open(os.path.join(dirname, fname)) 
    imarray = np.array(im) 
    final = np.stack((final,imarray), axis = 0) 

是得到以下錯誤: ValueError異常:所有輸入數組必須具有相同的形狀

imarray是(28,28)和i具有60K的圖像該文件夾中,所以我想使大小的陣列(60000,28,28)

感謝您的幫助 NK

+0

將這些圖像添加到列表中(在循環中)並將該列表作爲輸入(不在循環中)調用vstack。這對於性能尤爲重要。或者,如果您先驗知道有多少imgs即將到來。它們的形狀:構建一個空的3d數組並將其添加到此數組(更好的方法)。 – sascha

+0

我試過這個在os.listdir(dirname)中的fname: im = Image.open(os.path.join(dirname,fname)) imarray = np.array(im) fin = np.empty((60000 ,28,28)) fin = np.vstack((fin,imarray))並得到錯誤「所有輸入數組必須具有相同的維數」 – user6658936

+0

我描述了兩種不同的方法,不要混合它們。另外:這是不可讀的。那麼...... hpaulj的答案涵蓋了第一種方法。如果他的解決方案不起作用,你對形狀的假設(28,28)可能是錯誤的。 – sascha

回答

0

構建所有組件的列表並將它們堆疊一次:

alist = [] 
for fname in os.listdir(dirname): 
    im = Image.open(os.path.join(dirname, fname)) 
    imarray = np.array(im) 
    alist.append(imarray) 
final = np.stack(alist) # axis=0 is the default 

這會將它們連接到一個新的初始座標軸上。

+0

謝謝你的工作!可以在沒有列表的情況下完成(只是問) – user6658936

+0

是的,用我的第二種方法。它也節省了〜50%的內存。 '''arr = np.empty((60000,28,28))'''在循環外,然後'''arr [i] = img'''。 – sascha

+0

是的,但列表追加更有效的數組連接。預分配數組中的插入趨於一樣快。 – hpaulj