python - 从索引、值对填充一个 numpy 数组而不进行迭代
问题描述
我想通过索引将值关联到数组中,而不进行迭代。如下图,但有数十万个值:
to_populate = [
[[0, 0], 1],
[[1, 1], 100],
[[2, 3], 29],
[[3, 2], 33],
]
mat = np.empty((4, 4))
mat[:] = np.nan
for idx, val in to_populate:
x, y = idx
mat[x, y] = val
# array([[ 1., nan, nan, nan],
# [ nan, 100., nan, nan],
# [ nan, nan, nan, 29.],
# [ nan, nan, 33., nan]])
我认为它在概念上与 np.argwhere 的相反,但具有特定值而不是谓词条件。
mat = np.random.randn(3, 3)
# array([[ 0.89298522, 0.41059024, 0.32770948],
# [-0.91956498, -0.11774805, -1.42625182],
# [ 1.28644586, -0.06951971, -0.88742959]])
np.argwhere(mat < 0)
# array([[1, 0],
# [1, 1],
# [1, 2],
# [2, 1],
# [2, 2]])
解决方案
您可以“解压”to_populate
成行索引、列索引和值,然后使用切片:
import numpy as np
to_populate = [
[[0, 0], 1],
[[1, 1], 100],
[[2, 3], 29],
[[3, 2], 33],
]
# flatten the list
to_populate = np.array([[i[0][0], i[0][1], i[1]] for i in to_populate])
idx = to_populate[:,0]
idy = to_populate[:,1]
values = to_populate[:,2]
mat = np.full((4,4),np.nan)
mat[idx,idy]=values
mat
array([[ 1., nan, nan, nan],
[ nan, 100., nan, nan],
[ nan, nan, nan, 29.],
[ nan, nan, 33., nan]])
推荐阅读
- c# - 使用 Foreach 的 Linq (C#)
- git - Git-TF 将更改推送到错误的服务器
- python - 如何接收 Mac 的操作系统版本?对于 Python 3.7
- java - java.io 和文件系统块大小
- python - 如何在 List 中转换我的函数输出?
- reactjs - 如何在空输入字段的开头添加 React 工具提示
- android - 无法为弹出窗口活动设置透明背景
- swift - 两个来源的 RxSwift TestScheduler
- python - 如何在复杂的python类和函数之间传递变量?
- python - python项目中的导入错误(pipenv,pytest)