如何从地图中获取值并将它们设置为 numpy 矩阵行?

How to get values from a map and set them into a numpy matrix row?

我有一个 numpy 矩阵,我想用函数的结果填充它。此函数 returns 将映射到矩阵的一行中的整数值映射。

函数返回的值如下:

{1:6, 2:3, 3:2, 4:2, 5:1}

然后,我编写了以下代码来将值填充到矩阵中:

results = np.empty((10, 5), dtype=int)

for i in range(10):
    result = method()
    for j in range(5):
        results[i, j] = result[j]

我想知道是否有更多 properly/efficient 方法可以使用 python?

您可以简单地从字典中获取值,然后使用 np.full 创建您期望的矩阵:

>>> d={1:6, 2:3, 3:2, 4:2, 5:1}
>>> vals=d.values()
>>> np.full((10,5),list(vals))
array([[ 6.,  3.,  2.,  2.,  1.],
       [ 6.,  3.,  2.,  2.,  1.],
       [ 6.,  3.,  2.,  2.,  1.],
       [ 6.,  3.,  2.,  2.,  1.],
       [ 6.,  3.,  2.,  2.,  1.],
       [ 6.,  3.,  2.,  2.,  1.],
       [ 6.,  3.,  2.,  2.,  1.],
       [ 6.,  3.,  2.,  2.,  1.],
       [ 6.,  3.,  2.,  2.,  1.],
       [ 6.,  3.,  2.,  2.,  1.]])

如果 method 函数 return 在每次迭代中产生不同的结果,您可以使用列表理解来创建矩阵:

l = np.array([list(method().values()) for _ in range(1, 11)])

注意:由于您的字典键是排序的数字,在这种情况下,您的键有一个排序的哈希值,dict.values 方法 return 是一个基于您的键的排序值:

>>> list(map(hash, range (1 , 6)))
[1, 2, 3, 4, 5]

如果您的键不是排序的数字,您可以使用 collections.OrderedDict.

使您的方法函数 return 成为一个有序的字典

但请注意,由于 OrderedDict 是按插入顺序排列的,如果这是您想要的,您可以使用它。但是如果你想根据键排序,你可以使用下面的方法来获取值:

[map(dict.get, range(1, 6)) for _ in range(10)]

我会做几个假设。

method() return 每次调用都有不同的字典,因此您确实需要遍历 results.

的行

字典键不一定是数字顺序,所以我们需要使用d.keys().

我们都在使用 Python3,所以 keysvalues return 可迭代对象。因此,我将使用 fromiter(或 np.array(list(d.keys())

构造数组
d={1:6, 2:3, 3:2, 4:2, 5:1}
results=np.empty((4,5), int)  # np.zeros better?
for i in range(results.shape[0]):
    result = d # method() 
    ind = np.fromiter(d.keys(), int)-1
    val = np.fromiter(d.values(), int)
    results[i, ind] = val

所以与您的代码的主要区别在于我一次为一行分配数组。