web-dev-qa-db-fra.com

np tableaux étant immuables - "la destination de l'affectation est en lecture seule"

FD ** - Je suis un newb Python ainsi qu'un débord de pile newb, comme vous pouvez le constater. J'ai modifié la question en fonction des commentaires.

Mon objectif est de lire un ensemble de fichiers PNG, de créer une ou plusieurs images avec Image.open ("nom de fichier") et de les convertir en tableaux 2D simples contenant uniquement des 1 et des 0. Le format PNG est du format RGBA, avec pour la plupart uniquement des valeurs de 255 et 0. Assez souvent dans les images, les bords sont des valeurs d'échelle de gris, ce que j'aimerais éviter dans le tableau 2D. 

J'ai créé le tableau 2D à partir d'une image en utilisant np.asarray (Image) pour obtenir uniquement le canal "Rouge". Dans chacun des tableaux d'images en 2D, j'aimerais définir la valeur de la cellule = 1 si la valeur actuelle est différente de zéro.

Donc, je boucle dans le tableau 2d et je vérifie la valeur de la cellule et essayez de le définir à 1.

Cela me donne une erreur indiquant que le tableau est en lecture seule. J'ai lu à travers plusieurs threads de débordement de pile en expliquant que les tableaux np sont immuables et qu'il est encore un peu flou. J'utilise PIL et numpy

Merci @ user2314737. Je vais essayer de mettre ce drapeau. @ Eric, merci pour vos commentaires également. 

from PIL import Image
import numpy as np

Le code correspondant:

prArray = [np.asarray(img)[:, :, 0] for img in problem_images]

for img in prArray:
    for x in range(184):
        for y in range(184):
            if img[x][y] != 0:
                img[x][y] = 1

L'erreur "La destination de l'affectation est en lecture seule" est dans la dernière ligne.

Merci à tous pour l'aide. 

19

Vérifiez si le tableau est accessible en écriture avec

>>> img.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : True
  WRITEABLE : False
  ALIGNED : True
  UPDATEIFCOPY : False

Si WRITEABLEis est faux, changez-le avec

img.setflags(write=1)
41
user2314737

Depuis numpy version 1.16.0, ce qui suit ne fonctionne plus:

img = np.asarray(Image.open(filename))
img.setflags(write=1)

Le problème est que maintenant OWNDATA est défini sur False et vous ne pouvez pas définir l'indicateur WRITEABLE sur True. Par conséquent, vous devriez simplement faire ce qui suit:

img = np.array(Image.open(filename))

Si je ne me trompe pas, cela fera une copie du tableau lors de sa conversion de l'objet Pillow vers le tableau numpy. Cependant, j’ai testé les performances temporelles dans numpy1.16.0 et je n’ai trouvé aucune différence notable entre les deux méthodes.

3
AleksMat