Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类型错误:';int';对象不支持项分配。为什么?_Python_Python 3.x_Python Imaging Library - Fatal编程技术网

Python 类型错误:';int';对象不支持项分配。为什么?

Python 类型错误:';int';对象不支持项分配。为什么?,python,python-3.x,python-imaging-library,Python,Python 3.x,Python Imaging Library,为什么我会犯这个错误?我试图将图像输出为RGB值的嵌套列表。Python初学者顺便说一句 def imgRGB(im): width, height = im.size #create matrix matrix = [] for i in range(height): matrix.append([0, 0, 0] * width) #get the rgb values

为什么我会犯这个错误?我试图将图像输出为RGB值的嵌套列表。Python初学者顺便说一句

def imgRGB(im):
        width, height = im.size

        #create matrix
        matrix = []
        for i in range(height):
            matrix.append([0, 0, 0] * width)

        #get the rgb values
        for x in range(width):
            for y in range(height):
                r,g,b = im.getpixel((x,y))
                matrix[x][y][0] = r
                matrix[x][y][1] = g
                matrix[x][y][2] = b
        return matrix

[0,0,0]*width
是一个包含
3*width
整数的列表,而不是三元素列表的列表

你想要

matrix.append([[0,0,0] for _ in range(width)])

相反。

你会得到这个错误,因为你试图对一个只有两层深的结构进行三层查找

要使结构保持两层深度并修复代码,您的代码可能如下所示:

def imgRGB(im):
        width, height = im.size

        #create matrix
        matrix = []
        for i in range(height):
            matrix.append([0, 0, 0] * width)

        #get the rgb values
        for x in range(width):
            for y in range(height):
                r,g,b = im.getpixel((x,y))
                matrix[x][y*3+0] = r
                matrix[x][y*3+1] = g
                matrix[x][y*3+2] = b
        return matrix
顺便说一句,就我个人而言,我会使用一维numpy数组作为
矩阵
,而不是任何类型的Python列表,并使用
矩阵[(y*高度)+x+亚像素偏移量]
,其中
亚像素偏移量
对于r/g/b是0/1/2。或者,根据您的访问模式,您可以将r/g/b偏移放在不同的位置,然后乘以(x*y)


无论哪种方式,所需的内存分配和垃圾收集都要少得多,进行访问只需要(非常快的)指针算法。

您的
矩阵是二维的。你要做三次查找。因此,最后一次查找试图将整数视为一个列表……也就是说,
[0,0,0]*2
结果是
[0,0,0,0,0]
,而不是
[[0,0,0],[0,0,0]]
…这没什么错——更平坦的数据结构通常比嵌套的好——但您的查找和修改代码需要注意这一点。谢谢。现在我得到了:indexer-ror:list-index超出范围为什么?
x
迭代高度,而不是宽度。谢谢。我想稍后用PIL(低)输出它(修改),所以我使用了这个方法。。。我会尽量让它这样工作。优化将在稍后进行:)