【发布时间】:2018-12-23 19:02:32
【问题描述】:
我正在尝试加速 python sn-p。
给定两个大小相等(numpy)的数组,目标是找到一个数组(例如 a)中的值的平均值,对应于另一个数组(例如 b)的值。数组的索引是同步的。
例如;
a = np.array([1, 1, 1, 2, 2, 2])
b = np.array([10, 10, 10, 20, 20, 20])
a 中有两个不同的值,1 和 2。b 中同一索引处a 中有“1”的值是 [10,10,10]。因此,average(1) 为 10。类似地,average(2) 为 20。
我们可以假设a 中的不同值集是先验已知的。 a 中的值不必连续,顺序是随机的。我选择这样的例子只是为了简化描述。
我是这样处理的:
# Accumulate the total sum and count
for index, val in np.ndenumerate(a):
val_to_sum[val] += b[index]
val_to_count[val] += 1
# Calculate the mean
for val in val_to_sum.keys():
if val_to_count[val]: # skip vals with zero count
val_to_mean[val] = val_to_sum[val] / val_to_count[val]
这里的val_to_sum 和val_to_count 是根据a 中可以看到的已知值列表(在本例中为1 和2)初始化为零的字典。
我怀疑这是计算它的最快方法。我预计列表会很长,比如几百万,而可能值的集合大约是几十。
如何加快计算速度?
可以解决吗? 受以下答案之一的启发,这可能会做到:
for val in a
b[a==val].mean()
【问题讨论】:
-
给出的链接是一个普通的平均计算,这里不是这样。
-
如果是这种情况,您可以通过删除重复项来做到这一点。
-
您希望
a中有多少不同的值? -
“我预计列表会很长,比如几百万,而可能值的集合大约是几十。”说〜100个不同的值
标签: python performance numpy average