【发布时间】:2019-10-21 01:33:07
【问题描述】:
我有一个形状为 (N,) 的值数组 arr 和一个形状为 (N,2) 的坐标数组 coords。我想在 (M,M) 数组grid 中表示它,这样grid 在不在coords 中的坐标处取值 0,并且对于包含的坐标,它应该存储所有值的总和在具有该坐标的arr 中。因此,如果 M=3、arr = np.arange(4)+1 和 coords = np.array([[0,0,1,2],[0,0,2,2]]),那么 grid 应该是:
array([[3., 0., 0.],
[0., 0., 3.],
[0., 0., 4.]])
这很重要的原因是我需要能够多次重复此步骤,arr 中的值每次都会改变,坐标也会改变。理想情况下,我正在寻找矢量化解决方案。我怀疑我可能能够以某种方式使用np.where,但目前还不是很明显。
解决方案时间
我已经对此时存在的解决方案进行了计时,并且累加器方法似乎比稀疏矩阵方法稍快,由于 cmets 中解释的原因,第二种累加方法最慢:
%timeit for x in range(100): accumulate_arr(np.random.randint(100,size=(2,10000)),np.random.normal(0,1,10000))
%timeit for x in range(100): accumulate_arr_v2(np.random.randint(100,size=(2,10000)),np.random.normal(0,1,10000))
%timeit for x in range(100): sparse.coo_matrix((np.random.normal(0,1,10000),np.random.randint(100,size=(2,10000))),(100,100)).A
47.3 ms ± 1.79 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
103 ms ± 255 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
48.2 ms ± 36 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
【问题讨论】:
标签: python arrays numpy vectorization