【发布时间】:2021-02-23 23:38:50
【问题描述】:
我有两个 NumPy 数组,一个包含值,另一个将值从第一个映射到一个新的聚合数组,如下所示
a = np.array([10,10,10,10,10,10]) # values array
b = np.array([0,0,1,2,2,2]) # mapping to new index set
size = np.max(b) + 1
result =np.zeros(size)
for i in range(size):
result[i] = np.sum(a[b==i]) # values mapped to the same index are aggregated
print(result)
这给出了:
result = [20. 10. 30.]
上述方法有效,但由于 for 循环,它没有完全矢量化,因此速度很慢。根据我对线性代数的了解,我知道我可以将向量 b 转换为转换矩阵,然后使用 dot 函数在没有 for 循环的情况下执行此操作,但这意味着比此处所需的基本操作量要大得多,因此采用这种方法也是次优的。有没有办法直接用 NumPy 做到这一点? :) 原则上,所需的操作量应该只是 a.size 的总和......
【问题讨论】:
-
在您的示例中,
a中的所有值都是相同的。大概这不会是真的。对吗? -
有些事情令人困惑:您的
a数组只有 1 个值(即 10,有什么意义?),我希望输出数组的大小为b而不是 @987654326 @,即对于b中的每个索引,我们从a中获取对应的值。 -
嗨,是的,我已将所有值设置为 10,只是为了使总和示例在数字上易于理解。实际上,这些向量很大,数量也不同。
-
@Max 数组
b包含结果数组的索引。它表示映射,并且始终具有向量a的大小,因为它需要将向量a的每个元素映射到result向量中的新索引。