【问题标题】:Given a NumPy array and a many to one mapping array, what is the fastest way to calculate the aggregated mapped values给定一个 NumPy 数组和一个多对一映射数组,计算聚合映射值的最快方法是什么
【发布时间】: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 向量中的新索引。

标签: python numpy


【解决方案1】:

将循环替换为np.add.at(result, b, a)。这将完成您想要的聚合。有关at 方法的一般说明,请参阅ufunc.at

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    相关资源
    最近更新 更多