系统地移动numpy数组中的每个数字

时间:2013-04-16 13:58:09

标签: python arrays numpy python-imaging-library

我有一个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

任何人都可以告诉我如何修复其中一个或推荐另一个有效吗?

1 个答案:

答案 0 :(得分:0)

您无法使用ii获取rand_image rand_image[ii,:]行的原因是因为rand_image是PIL图像对象,并且没有相同的索引访问权限一个数组有。如果您想获得ii行,则必须使用rand_array[ii](我不需要使用尾随冒号,:

这似乎与您的

类似
  

另一版coordinate

哪个应该有效,因为您使用的是数组而不是Image。我的猜测是你没有在完全相同的地方取代它,可能在for ii in ...循环之外的某个地方,因为ii只能在coordinate内正确定义那个循环。


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


函数newvalue = rand_image.putpixel(...) 不返回任何内容,因此当您说:

newvalue

None将是rand_image.putpixel(...) return rand_image (python中的'空'对象)。也许你想这样做:

newvalue

未设置rand_image并尝试将其返回,而是更改rand_image中的像素并返回新的int()


作为旁注,你不应该在numpy数组上调用int,相反,如果你想要数组中每个元素的类型为.astype,你应该使用{{1如上所述,或者首先将其作为int启动。一旦它以int开头,它应该保持这种状态,除非你以某种方式投射它(你在这个脚本中没有这样做)。


最后需要注意的是,使用numpy(不使用纯python循环)可以更快地完成 lot ,但我不确定你要做什么。如果你编辑你的问题来解释一下你正在尝试做什么,以便我可以用一些上下文阅读代码,我可以提供帮助。例如,a行中newvalue = ...应该是什么?