为什么这段代码在运行一段时间后会抛出"TypeError: cannot unpack non-iterable int object"?



这是我正在处理的数据帧头部的一个可显示片段。

这是在Jupyter笔记本里

我试图填充baseData的一个空列(充满np.nan(,名为"Average Colour"。该列的每个元素代表从其各自的"图标URL"加载的图像的平均颜色。

这是我的代码

def compute_average_image_color(img):
width, height = img.size
r_total = 0
g_total = 0
b_total = 0
count = 0
for x in range(0, width):
for y in range(0, height):
r, g, b = img.getpixel((x,y))
r_total += r
g_total += g
b_total += b
count += 1
return (r_total/count, g_total/count, b_total/count)
def get_average_color(URL):
if URL != np.nan:
urllib.request.urlretrieve(URL, "local.jpg")
with Image.open("local.jpg") as img:
img = img.resize((50,50)) #To make this run MUCH faster.
return compute_average_image_color(img)
baseData["Average Colour"] = baseData["Icon URL"].apply(lambda x: get_average_color(x))

compute_average_image_color((不是我的,我知道它有效。据我所知,get_average_color((按预期工作。这段代码运行了37次迭代,然后崩溃:

TypeError                                 Traceback (most recent call last)
<ipython-input-51-1675bd6f49ad> in <module>
41             return compute_average_image_color(img)
42 
---> 43 baseData["Average Colour"] = baseData["Icon URL"].apply(lambda x: get_average_color(x))
44 
45 
~Anaconda3libsite-packagespandascoreseries.py in apply(self, func, convert_dtype, args, **kwds)
3589             else:
3590                 values = self.astype(object).values
-> 3591                 mapped = lib.map_infer(values, f, convert=convert_dtype)
3592 
3593         if len(mapped) and isinstance(mapped[0], Series):
pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()
<ipython-input-51-1675bd6f49ad> in <lambda>(x)
41             return compute_average_image_color(img)
42 
---> 43 baseData["Average Colour"] = baseData["Icon URL"].apply(lambda x: get_average_color(x))
44 
45 
<ipython-input-51-1675bd6f49ad> in get_average_color(URL)
39         with Image.open("local.jpg") as img:
40             img = img.resize((50,50)) #To make this run MUCH faster.
---> 41             return compute_average_image_color(img)
42 
43 baseData["Average Colour"] = baseData["Icon URL"].apply(lambda x: get_average_color(x))
<ipython-input-51-1675bd6f49ad> in compute_average_image_color(img)
27     for x in range(0, width):
28         for y in range(0, height):
---> 29             r, g, b = img.getpixel((x,y))
30             r_total += r
31             g_total += g
TypeError: cannot unpack non-iterable int object

我查了一下我的电子表格,指数37或它周围的指数(35-39(没有什么特别的,所以我不知道为什么只有在37次跑步后才会发生这种情况。有问题的索引具有图标URL"https://is1-ssl.mzstatic.com/image/thumb/Purple4/v4/e6/88/05/e688059e-2809-4f8f-9f78-cb7ceb7b461b/source/512x512bb.jpg",这似乎一点也不特别

此外,这张表有17000个索引,Jupyter Notebook似乎只以每秒1个索引的速度运行。这只是朱皮特被人为放慢了速度吗?我当然希望如此,因为这意味着我可以在.py.中更快地运行它

url可能是invalid。如果url无效,则生成的图像将是来自PIL的2 dimensions。因此,为了更安全起见,将图像转换为numpy数组,并使用下面这样的矢量化方法,这比循环快得多。

import numpy as np 
def compute_average_image_color(img):
img = np.array(img)
try:
r_mean = img[:,:,0].mean()
g_mean = img[:,:,1].mean()
b_mean = img[:,:,2].mean()
return (r_mean,g_mean,b_mean)
except:
mean = img.mean()
return (mean,mean,mean)

最新更新