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

时间:2015-09-30 14:12:41

标签: python numpy matrix python-3.4

我有一个numpy矩阵,我想填写一个函数的结果。此函数返回一个整数值的映射,该映射将被加到矩阵的一行中。

该函数返回的值如下:

{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]

我想知道使用python是否有更合适/更有效的方法吗?

2 个答案:

答案 0 :(得分:1)

您只需从字典中获取值,然后使用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函数在每次迭代中返回不同的结果,您可以使用列表推导来创建矩阵:

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

注意:由于您的字典键是已排序的数字,在这种情况下,您的键具有已排序的哈希值,dict.values方法会根据您的键返回已排序的值:

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

如果您的键不是已排序的数字,则可以使用collections.OrderedDict使方法函数返回有序字典。

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

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

答案 1 :(得分:0)

我会做几个假设。

method()会在每次调用时返回不同的字典,因此您需要遍历results行。

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

我们都在使用Python3,因此keysvalues会返回iterables。因此,我将使用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

因此,与代码的主要区别在于我一次将数组赋值为一行。