我正在尝试构建一个返回数组元素子集乘积的函数。基本上我想构建一个prod_by_group
执行此操作的函数:
values = np.array([1, 2, 3, 4, 5, 6])
groups = np.array([1, 1, 1, 2, 3, 3])
Vprods = prod_by_group(values, groups)
结果Vprods
应该是:
Vprods
array([6, 4, 30])
对于我认为应该类似于的元素总和,这里有一个很好的答案: https ://stackoverflow.com/a/4387453/1085691
我尝试采用第log
一个,然后sum_by_group
,然后exp
,但遇到了数字问题。
对于按组划分的元素的最小值和最大值,这里还有一些其他类似的答案: https ://stackoverflow.com/a/8623168/1085691
编辑:感谢您的快速回答!我正在尝试它们。我应该补充一点,我希望它尽可能快(这就是我试图以某种矢量化方式在 numpy 中获取它的原因,就像我给出的示例一样)。
编辑:我评估了迄今为止给出的所有答案,下面的@seberg 给出了最好的答案。这是我最终使用的完整功能:
def prod_by_group(values, groups):
order = np.argsort(groups)
groups = groups[order]
values = values[order]
group_changes = np.concatenate(([0], np.where(groups[:-1] != groups[1:])[0] + 1))
return np.multiply.reduceat(values, group_changes)