假设有一个2D数组,它被分成几个子区域,如regions。还有一个数组,里面充满了值。我想按子区域聚合值。下面的代码是我的解决方案。
但是,当子区域的数量很大时,迭代花费很多时间。我想问一下,有没有什么方法可以加速程序?我想也许numpy可以做到这一点,但我不知道如何做到。
import numpy as np
regions = np.array([[0,0,0,1],
[0,0,1,1],
[1,1,1,2],
[2,2,2,2]], dtype=np.int32)
value_array = np.array([[9,5,8,4],
[6,4,8,5],
[4,5,9,7],
[4,7,3,0]], dtype=np.float32)
aggre_array = np.zeros_like(value_array)
for r in range(regions.max()+1):
region = regions==r
aggre_array[region] = value_array[region].mean()
print(aggre_array)
'''output
[[6.4 6.4 6.4 5.8333335]
[6.4 6.4 5.8333335 5.8333335]
[5.8333335 5.8333335 5.8333335 4.2 ]
[4.2 4.2 4.2 4.2 ]]
'''
1条答案
按热度按时间4zcjmb1e1#
在这样的分组中,你需要使用按索引排序的数组的扁平化变体来对第一个数组进行排序,比如:
后一部分是找出区分各组的指数,并将其用于进一步计算各组的总和、计数和平均值:
最后,重复这些值,使其适合value_array,按相反顺序重新排列这些值,并将其调整为初始形状。
我还找到了一种方法来实现它
numpy_indexed
包设计用于以有效的方式解决分组问题: