这个问题在这里已经有了答案:
如何将列表元素作为参数传递(1个答案)
昨天关门了。
我正在尝试将图像中的rbg值转换为颜色名称。我使用的函数输出rbg值如下: get_colors(image, 3, False)
→ [array([180.60849865, 187.12872355, 191.33901941]), array([254.80780926, 254.83214586, 254.8409425 ]), array([191.33977471, 197.17187803, 200.97835918])]
我想通过以下函数以三个一对的方式迭代这些变量作为单个参数:
def recognize_color(R,G,B):
minimum = 10000
for i in range(len(csv)):
d = abs(R- int(csv.loc[i,"R"])) + abs(G- int(csv.loc[i,"G"]))+ abs(B- int(csv.loc[i,"B"]))
if(d<=minimum):
minimum = d
cname = csv.loc[i,"color_name"]
return cname
我主要是在处理这个数组列表,并将它们排列到函数中。理想情况下,我希望从rgb阵列列表中创建一个颜色名称列表
2条答案
按热度按时间cnwbcb6i1#
您可以将理解与参数解包一起使用:
在每次迭代中,
color
将是一个包含三个元素的数组,可以将其扩展为任意iterable,并将其扩展为一个参数元组recognize_color
.结果将是一个名称列表,每个名称的返回值对应一个名称
get_colors
.你也可以使用
itertools.starmap
为此:这将产生一个惰性生成器,您可以迭代该生成器以按需获取值,包括将其转换为列表:
1tuwyuhd2#
for循环的替代方法:矢量化
这个答案有点不同。通常,如果您可以将操作矢量化,那么执行时间可能会显著减少。
下面是一个解决方案,它处理整个
[R, G, B]
点,而不使用任何for
环复制步骤:
运行c段
运行b部分
运行段a
最后运行最上面的代码块。
或者,您可以运行此笔记本:
a。矢量化代码:识别颜色()
你只需要这个函数就可以得到你想要的,而不需要使用任何函数
for
环b。虚拟数据
我们将使用以下5行颜色作为虚拟数据来测试解决方案。
现在,让我们创建虚拟数据并将其加载到两个 Dataframe 中:
dfc
:要为其命名的颜色的数据框dfr
:数据框中包含名称的颜色target_column
颜色c。虚拟数据代码
以下所有代码仅用于创建虚拟数据,而不是主解决方案所需的代码。