Python 如何从映射中获取值并将其设置为numpy矩阵行?

Python 如何从映射中获取值并将其设置为numpy矩阵行?,python,numpy,matrix,python-3.4,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] 我想知道是否有一

我有一个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实现这一点?

您只需从字典中获取值,然后使用
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.]])
如果
方法
函数在每次迭代中返回不同的结果,则可以使用列表理解创建矩阵:

l = np.array([list(method().values()) for _ in range(1, 11)])
注意:由于您的字典键是排序的数字,在这种情况下,您的键有一个排序的哈希值,
dict.values
方法根据您的键返回一个排序的值:

>>> list(map(hash, range (1 , 6)))
[1, 2, 3, 4, 5]
如果键不是已排序的数字,则可以使用使方法函数返回已排序的字典

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

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

我会做一些假设

method()
每次调用都返回不同的字典,因此您确实需要迭代
结果的行

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

我们都在使用Python3,因此
返回可编辑项。因此,我将使用
fromiter
(或
np.array(list(d.keys())
)构建数组


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

#首先:这将崩溃…Numpy数组以0索引开始。“results[10,x]”将崩溃!#其次:您应该更改“function”以返回与dict不同的值。似乎没有任何间隙(dict中的键是1、2、3、4、5).没有理由使用dict作为稀疏数据结构。这只会减慢速度。#第三:结果[i][j]应该是结果[i,j]!你应该清楚地指出你的字典键是从0还是1开始的。sascha:谢谢,我已经编辑了你评论后的问题。Anand:字典键是从1开始的,但是如果更方便的话,我可以修改函数以在另一个数据结构中返回信息!好吧……如果没有间隙,为什么不生成numpy数组呢或者在method()中列出并返回此值。这样就可以得到results[i,:]=result[:]了!您可以看到:准确地知道method()生成的内容非常重要。@Sascha:The method()返回给定长方体长度的图形所需的长方体数,其中长方体长度是介于1和图形直径之间的每个值。因此,我认为返回包含{box_length:number_of_boxes}的字典是很清楚的。但我也可以返回一个列表,在文档中说明索引+1将与框大小相对应,该位置的值将是框的数量。您还需要包括当
方法()返回不同的词典时如何调整此方法
每行。这似乎是OP的情况。@AnandSKumar因为它没有将任何参数传递给
方法
每次的结果是一个dict。我猜是
方法()
只是一个简单的例子,OP用来表示每次迭代时他都从一个方法获取dict,实际的方法及其调用可能会有很大的不同。尽管我会让OP澄清这一点。你的第二个方法与删除的答案相同,这不起作用,因为-你不能依赖result.values()以1-5的顺序返回结果,因为结果是一个字典,它没有任何顺序。@AnandSKumar请查看注释。
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