python - 在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)
解决方案
一种方法是创建一个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 - Python检查字符串是否在列表中可用
- macos - 在 /Library/User Template 中保留硬符号链接的文件权限?
- google-apps-script - 如何使用谷歌应用脚本在谷歌表单的开头添加新问题?
- visual-studio-code - 安装最新 VS Code + .Net SDK + Omnisharp ext 的正确方法,并避免错误:“尝试更新未加载的项目”
- angular - 如何使用嵌套数组为对象创建接口
- python - 尝试收集数据并创建循环以获取最后一行并使用该项目来更新请求
- odoo - 如何读取安装在 ubuntu 20 上的 odoo enterprise 14 的日志记录
- mongodb - 有没有办法永久更改 MongoDB 的 Batchsize?
- python - 在python中将数据从向量移动到二维数组的更快方法?
- python - Tkinter grid() 不符合预期