首页 > 解决方案 > 在numpy中将带坐标的一维数组转换为二维数组

问题描述

我有一个形状为 (N,) 的值数组和一个形状为 (N,2)arr的坐标数组。coords我想在 (M,M) 数组grid中表示grid它,以便在不在的坐标处取值 0 coords,并且对于包含的坐标,它应该存储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某种方式使用,但如何使用还不是很明显。

定时解决方案

我已经对此时出现的解决方案进行了计时,并且累加器方法似乎比稀疏矩阵方法稍快,由于评论中解释的原因,第二种累加方法最慢:

%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)

标签: pythonarraysnumpyvectorization

解决方案


一种方法是创建一个sparse.coo_matrix并将其转换为密集的:

from scipy import sparse
sparse.coo_matrix((arr,coords),(M,M)).A
# array([[3, 0, 0],
#        [0, 0, 3],
#        [0, 0, 4]])

推荐阅读