首页 > 解决方案 > 从索引、值对填充一个 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]])

标签: pythonarraysnumpy

解决方案


您可以“解压”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]])

推荐阅读