2017-10-17 67 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