np数组是不可变的-“分配目标是只读的”

2024-04-26 02:54:50 发布

您现在位置:Python中文网/ 问答频道 /正文

FD**-我是一个Python新手,正如你所知,我是一个堆栈溢出新手。我根据评论编辑了这个问题。

我的目标是读取一组PNG文件,用Image.open('filename')创建图像,并将其转换为只有1和0的简单二维数组。PNG的格式是RGBA,其值大多只有255和0。在图像中,边缘通常是灰度值,我希望在二维数组中避免这种情况。

我用np.asarray(图像)创建了2D数组,只得到“红色”通道。在每个2d图像数组中,如果当前值不为零,我想将单元格值设置为1。

所以,我循环到2d数组中,检查单元格的值并尝试将其设置为1。

它给了我一个错误,表明数组是只读的。我阅读了几个堆栈溢出线程,讨论了np数组是不可变的,这仍然有点不清楚。我用皮尔和努比

谢谢@user2314737。我会试着插上那面旗子。 @埃里克,也谢谢你的评论。

from PIL import Image
import numpy as np

相关代码:

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

最后一行出现错误“assignment destination is read-only”。

谢谢大家的帮助。


Tags: in图像imageimportimgforpng堆栈
3条回答

由于numpy版本1.16.0,以下不再工作:

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

问题是现在OWNDATA被设置为False,并且您不能将WRITEABLE标志设置为True。因此,您只需执行以下操作:

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

这将在将数组从Pillow对象强制转换为numpy数组时生成数组的副本。然而,我在numpy1.16.0中测试了时间性能,并没有发现两种方法之间有任何明显的差异。

检查数组是否可以用

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

如果WRITEABLE为false,则将其更改为

img.setflags(write=1)

在这种情况下,我认为您正在尝试编辑另一个用户提供给您的图像,而他/她使其不可编辑,这就是为什么您会得到这个错误。对于您的情况,您可以尝试复制给定的文件,并使用.copy()对该文件进行更改。

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

更重要的是,我不认为我们大多数人都想改变我们的原始图像,这就是为什么我总是使用.copy()并建议您也这样做。

相关问题 更多 >