【发布时间】:2016-03-01 12:21:52
【问题描述】:
我在一个 numpy 数组 X 中有一个图像:
array([[ 0.01176471, 0.49019608, 0.01568627],
[ 0.01176471, 0.49019608, 0.01568627],
[ 0.00784314, 0.49411765, 0.00784314],
...,
[ 0.03921569, 0.08235294, 0.10588235],
[ 0.09411765, 0.14901961, 0.18431373],
[ 0.10196078, 0.15294118, 0.21568627]])
我已经在这个数组上运行了一个聚类算法来找到相似的颜色,并有另一个数组,其中每个像素 Y 都有类:
array([19, 19, 19, ..., 37, 20, 20], dtype=int32)
用该集群的平均值替换集群中所有像素的颜色的最快、最漂亮和最 Python 的方法是什么?
我想出了以下代码:
import pandas as pd
import numpy as np
<...>
df = pd.DataFrame.from_records(X, columns=list('rgb'))
df['cls'] = Y
mean_colors = df.groupby('cls').mean().values
# as suggested in comments below
# for cls in range(len(mean_colors)):
# X[Y==cls] = mean_colors[cls]
X = mean_colors[Y]
有没有办法只在 pandas 或只在 numpy 中做到这一点?
【问题讨论】:
-
假设
Y包含所有标签,那么简单的索引mean_colors[Y]怎么样? -
对于您的示例,您的代码不起作用,因为您在
Y中有 3 个不同的值,您何时比较Y==cls没有任何反应,因为索引中没有...(cls只等于 0, 1, 2) -
@Divakar 是的,很漂亮,谢谢!
-
@AntonProtopopov 它有效,我试过了。我在 Y 中没有 3 个值,我在 X 中有它们。
-
@Direvius 如果不复制您的结果,很难回答。您可以减少您的
X和Y并将它们附加到工作代码或生成mcve。无论如何,我有来自原始来源的数据,这只是对未来的建议
标签: python arrays numpy pandas