2017-10-17 8 views
0

J'ai besoin de lire des fichiers d'image (28 * 28) d'un dossier et de les empiler pour faire un tableau unique pour l'analyse.tableau 2d 3d pour faire en python

Je le code suivant:

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) 

reçois l'erreur suivante: ValueError: tous les tableaux d'entrée doivent avoir la même forme

imarray est (28,28) et j'ai images 60K dans ce dossier, donc je veux faire un tableau de taille (60000,28,28)

Merci pour l'aide NK

+0

Ajouter ces images à une liste (en boucle) et appeler vstack avec cette liste comme entrée (pas en boucle). C'est particulièrement important pour la performance. Ou si vous savez a priori combien d'imgs viennent incl. leur forme: construire une matrice 3d vide et les ajouter à ce tableau (meilleure approche). – sascha

+0

J'ai essayé ceci pour fname dans os.listdir (dirname): im = Image.open (os.path.join (dirname, fname)) imarray = np.array (im) fin = np.empty ((60000 , 28,28)) fin = np.vstack ((fin, imarray)) et l'erreur « tous les tableaux d'entrée doivent avoir le même nombre de dimensions » – user6658936

+0

I décrit deux approches différentes, ne pas les mélanger. Aussi: c'est impossible à lire. Eh bien ... la réponse de hpaulj couvre la première approche. Si sa solution ne fonctionne pas, votre hypothèse sur la forme (28,28) est probablement fausse. – sascha

Répondre

0

Dressez une liste de tous les composants et les empiler une fois:

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 

Cela les rejoindre sur un nouvel axe initial.

+0

merci qui a fonctionné !! peut-il être fait sans la liste aussi (juste en demandant) – user6658936

+0

Oui, avec ma deuxième approche. Il économise également ~ 50% de la mémoire. '' 'arr = np.empty ((60000, 28, 28))' '' en dehors de la boucle, alors '' 'arr [i] = img''' pour chaque i dedans. – sascha

+0

Oui, mais l'ajout de liste est plus efficace que la concaténation de tableau. L'insertion dans un réseau préalloué a tendance à être aussi rapide. – hpaulj