【问题标题】:Systematically moving through every number in a numpy array系统地遍历 numpy 数组中的每个数字
【发布时间】:2013-04-16 13:58:08
【问题描述】:

我有一个 500x500 数组,我正在尝试编写一个名为“坐标”的变量,该变量将挑选出每个值,然后将其应用于函数,但我不断得到输出,

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__

这是我的代码

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)

我也一直在摆弄另一个版本的坐标,

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

但它只是返回,

NameError: name 'ii' is not defined

谁能告诉我如何解决这些问题或推荐另一种可行的方法?

【问题讨论】:

  • 如果我们有完整的回溯,而不仅仅是“AttributeError: getitem”,那么直接解决问题会更容易。我怀疑它可能来自 rand_image[ii, :] 调用?

标签: python arrays numpy python-imaging-library


【解决方案1】:

使用rand_image[ii,:] 无法获得rand_imageiith 行的原因是rand_image 是一个PIL Image 对象,并且没有数组所具有的索引访问权限。如果你想得到iith 行,你必须使用rand_array[ii](我已经去掉了结尾的冒号,: 不是必需的)

这似乎与您的相似

另一个版本的coordinate

这应该有效,因为您使用的是数组而不是图像。我的猜测是,您没有将它完全替换在与第一个版本相同的位置,可能是在 for ii in ... 循环之外的某个地方,因为 ii 仅在该循环中正确定义。


正如您所定义的,coordinate 不是一个函数,它是一个长度为 2 的元组。但是当您编写 coordinate(a, ii) 时,您将其称为函数。相反,您可能只想在那里使用coordinate(我不确定a 应该是什么。


函数.putpixel不返回任何东西,所以当你说:

newvalue = rand_image.putpixel(...)

newvalue 将是 None(python 中的“空”对象)。也许你想这样做:

rand_image.putpixel(...)
return rand_image

不设置newvalue 并尝试返回它,而是更改rand_image 中的像素并返回新的rand_image


附带说明,您不应该在 numpy 数组上调用 int(),相反,如果您希望数组中每个元素的类型为 int,您应该像上面那样使用 .astype ,或者首先将其作为int 启动。一旦它以 int 开始,它应该保持这种状态,除非你以某种方式投射它(你在这个脚本中没有这样做)。


最后一点,使用 numpy(不使用纯 python 循环)可能会很多更快地完成此过程,但我不确定您到底想要做什么。如果您编辑您的问题以解释您正在尝试做什么,以便我可以在某些上下文中阅读代码,我可以提供帮助。例如,a 应该在 newvalue = ... 行中是什么?

【讨论】:

    猜你喜欢
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 2011-08-07
    • 2017-08-12
    • 2012-07-04
    相关资源
    最近更新 更多