python - 将带有坐标的一维数组转换为numpy中的二维数组

标签 python arrays numpy vectorization

我有一个值数组arr具有形状 (N,) 和坐标数组 coords形状为 (N,2)。我想用 (M,M) 数组 grid 来表示它这样gridcoords 之外的坐标处取值 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不知怎的,但目前还不清楚如何做到这一点。

解决方案的时机

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

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

最佳答案

一种方法是创建一个 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]])

关于python - 将带有坐标的一维数组转换为numpy中的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56462192/

相关文章:

python - 限制 seaborn distplot KDE 估计中 x 的范围

Python - curve_fit 给出不正确的系数

python - 如何在 python 中从全局范围运行 "exec"

javascript - 从字符串数组中创建 JSON 对象数组

java - 在jsp中迭代和打印带有嵌套数组的HashMap的内容

c++ - C++ 对象如何处理被分配数组文字?

python - 将值分配给 Numpy 数组中的不同索引位置

python-3.x - 如何检查 Pandas 单元格值是否为 nan

python - 在 IPython Notebook 中更改绘图窗口大小

python - 在纯 numpy 中矢量化康威的生命游戏?