我正在try 计算数字数组中列子集的聚合指标(例如,平均值、中位数、和).
以此数组为例:
1 6 3 4
2 3 4 5
1 4 5 6
3 5 6 7
我有一组簇,它们是列索引的列表,如下所示:
clusters = [[0, 1], [2], [3]]
数组和簇索引列表都可以很大,并且我可以保证数组中的每一列只属于一个簇,即簇列表中没有重复项.列表中的索引不一定是有序的,也就是说,[[0, 3], [2, 1]]
也是一个有效的集群.
例如,我要找的是对每个集群的值进行求和--上例的结果如下所示:
[25, 18, 22]
Python中的一个简单实现可能看起来像这样:
import numpy as np
arr = np.array([
[1, 6, 3, 4],
[2, 3, 4, 5],
[1, 4, 5, 6],
[3, 5, 6, 7],
])
clusters = [[0, 1], [2], [3]]
result = np.array([arr[:,c_indices].sum() for c_indices in clusters])
# array([25, 18, 22])
我的问题是矩阵和集群的数量可能会变得非常大,我希望避免在Python中循环,而是出于性能原因在NumPy的C实现中尽可能多地保留这些内容.
Are there more efficient ways of doing this? (理想情况下与最小值、最大值、中位数、平均值和总和兼容)