[英]Python/Numpy get average of array based on index
我有两个 numpy arrays,第一个是values
,第二个是indexes
。 我想要做的是根据indexes
数组获取values
数组的平均值。
例如:
values = [1,2,3,4,5]
indexes = [0,0,1,1,2]
get_indexed_avg(values, indexes)
# should give me
# [1.5, 3.5, 5]
此处, indexes
数组中的值表示最终数组中的索引。 因此:
values
数组中的前两项被平均以形成最终数组中的零索引。values
数组中的第 3 项和第 4 项被平均以形成最终数组中的第一个索引。我确实有一个 python 解决方案。 但这太可怕了,而且速度很慢。 有更好的解决方案吗? 也许使用 numpy? 或其他此类图书馆。
import pandas as pd
pd.Series(values).groupby(indexes).mean()
# OR
# pd.Series(values).groupby(indexes).mean().to_list()
# 0 1.5
# 1 3.5
# 2 5.0
# dtype: float64
我想避免使用熊猫,所以我花了很多时间弄清楚。 做到这一点的方法是使用所谓的one-hot encoding 。
创建索引的 one-hot 编码将为我们提供一个二维数组,在我们想要它们的地方有 1。 例如:
indexes = np.array([0,0,1,1,2])
# one_hot = array(
# [[1., 0., 0.],
# [1., 0., 0.],
# [0., 1., 0.],
# [0., 1., 0.],
# [0., 0., 1.]]
# )
我们只需要为索引数组获取一个 one-hot 并将其与值相乘即可得到我们想要的。 使用这篇文章的答案
values = np.array([1,2,3,4,5])
indexes = np.array([0,0,1,1,2])
one_hot = np.eye(np.max(indexes) + 1)[indexes]
counts = np.sum(one_hot, axis=0)
average = np.sum((one_hot.T * values), axis=1) / counts
print(average) # [1.5 3.5 5.]
最简单易行的解决方案:
values = np.array([1,2,3,4,5])
indexes = np.array([0,0,1,1,2])
index_set = set(indexes) # index_set = {0, 1, 2}
# Now get values based on the index that we saved in index_set
# and then take an average
avg = [np.mean(values[indexes==k]) for k in index_set]
print(avg) # [1.5, 3.5, 5.0]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.