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/

相关文章:

c - 逐行阅读时用逗号分割单词。 C

c - 将文本文件的每一行转换为数组 c

python - 与 numpy 不同,带有 NaN 的 Pandas 系列 np.max 不会将 NaN 显示为最大值

javascript - 无法添加数组索引

python - 在类初始化时使用数组中的变量定义函数

linux - 如何让 python 访问 ubuntu 中的系统范围模块?

python - Flask 甚至不检查文件就返回响应

Python 从外部 C 程序调用中输出带有换行符的字符串

python - Facebook : How to send a private message as a fanpage using xmpp

python - 如何使用 Python 套接字发送 SIP 消息