繁体   English   中英

Python/Numpy 根据索引获取数组的平均值

[英]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数组中的值表示最终数组中的索引。 因此:

  1. values数组中的前两项被平均以形成最终数组中的零索引。
  2. values数组中的第 3 项和第 4 项被平均以形成最终数组中的第一个索引。
  3. 最后,最后一项用于最终数组中的第二个索引。

我确实有一个 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM