2013-04-16 2 views
0

J'ai un tableau 500x500 et j'essaye d'écrire une variable appelée "coordonnée" qui va choisir chaque valeur puis l'appliquer à une fonction mais je continue à obtenir la sortie,Déplacement systématique de tous les nombres dans un tableau numpy

AttributeError       Traceback (most recent call last) 
/home/graham/<ipython-input-17-cc6ce0649eda> in <module>() 
    31       pass 
    32 
---> 33 finished_array = rand_array_color(rand_array) 
    34 
    35 finished_image = Image.fromarray(finished_array) 

/home/graham/<ipython-input-17-cc6ce0649eda> in rand_array_color(rand_array) 
    23   from PIL import Image 
    24   for ii in numpy.nditer(rand_array): 
---> 25     coordinate = tuple(map(int, rand_image[ii,:])) 
    26     if ii < 128: 
    27       print "false" 

/usr/lib/python2.7/dist-packages/PIL/Image.pyc in __getattr__(self, name) 
    510    new['data'] = self.tostring() 
    511    return new 
--> 512   raise AttributeError(name) 
    513 
    514  ## 

AttributeError: __getitem__ 

Voici mon code

from PIL import Image 
from numpy import random 

im = Image.open('/home/graham/Desktop/Experiment/gwarner/labeled_photos/photos/003030.png') 

rand_array = numpy.random.randint(255, size=(500,500)).astype('uint8') 

rand_image = Image.fromarray(rand_array) 

def rand_array_color(rand_array): 
    from PIL import Image 
    for ii in numpy.nditer(rand_array): 
     coordinate = tuple(map(int, rand_image[ii,:])) 
     if ii < 128: 
      newvalue = rand_image.putpixel(coordinate(a,ii), im.getpixel(coordinate(a,ii))) 
      return newvalue 
     else: 
      pass 

finished_array = rand_array_color(rand_array) 

J'ai aussi bidouiller avec une autre version de coordonnées,

coordinate = tuple(int(rand_array[ii,0]),int(rand_array[ii,1]) 

mais il retourne juste,

NameError: name 'ii' is not defined 

Quelqu'un peut-il me dire comment résoudre l'un de ceux-ci ou recommander un autre qui fonctionne?

+1

Si nous avions la trace complète, pas seulement "AttributeError: __getitem__", il serait plus facile d'aller directement au problème. Je soupçonne que cela pourrait être de l'appel rand_image [ii,:]? – Oin

+0

Je viens de l'ajouter. –

Répondre

0

La raison pour laquelle vous ne pouvez pas obtenir la ligne ii e de rand_image en utilisant rand_image[ii,:] est parce que rand_image est un objet d'image PIL, et n'a pas le même accès à l'indexation qu'un tableau a. Si vous voulez obtenir la ligne ii e, vous devez utiliser rand_array[ii] (je l'ai laissé au large du côlon arrière ,: n'est pas nécessaire)

Cela semble être similaire à votre

another version of coordinate

qui devrait fonctionner parce que vous utilisez le tableau au lieu de l'image. Je suppose que vous ne l'avez pas remplacé dans exactement au même endroit que la première version, peut-être quelque part en dehors de la boucle for ii in ..., car ii est seulement correctement défini dans cette boucle.


Comme vous l'avez défini, coordinate n'est pas une fonction, il est un tuple de longueur 2. Mais vous l'appelez en fonction lorsque vous écrivez coordinate(a, ii). Au contraire, vous voulez probablement juste utiliser coordinate là (je ne suis pas sûr de ce que a est censé être


La fonction .putpixel ne retourne rien, de sorte que lorsque vous dites:.

newvalue = rand_image.putpixel(...) 

newvalue sera None (l'objet 'vide' en python) peut-être que vous voulez faire.

rand_image.putpixel(...) 
return rand_image 

sans se tting le newvalue et en essayant de le retourner, mais au lieu de changer le pixel dans le rand_image et en renvoyant le nouveau rand_image.


Comme une note de côté, vous ne devriez pas appeler int() sur un tableau numpy, au lieu, si vous voulez que le type de chaque élément du tableau à être int, vous devez utiliser soit .astype comme vous l'avez fait ci-dessus, ou l'initier en tant que int en premier lieu. Une fois qu'il commence comme un int, il devrait rester ainsi sauf si vous le lancez d'une façon ou d'une autre (ce que vous n'avez pas fait dans ce script).


Comme note finale de ce processus pourrait probablement être fait beaucoup plus rapidement en utilisant numpy (ne pas utiliser des boucles python pur) mais je ne sais pas exactement ce que vous essayez de faire. Si vous éditez votre question pour expliquer un peu ce que vous essayez de faire pour que je puisse lire le code avec un certain contexte, je pourrais vous aider. Par exemple, qu'est-ce que a est supposé être dans la ligne newvalue = ...?

+0

Je vois maintenant pourquoi vous appelez 'int': http://stackoverflow.com/q/15621691/1730674 – askewchan

Questions connexes