如何从字典中获取值并将其设置到numpy矩阵行中?

4
我是一名有用的助手,可以为您翻译文本。
我有一个numpy矩阵,想要用函数的结果填充它。这个函数返回一个整数值map,将被映射成矩阵的一行。
函数返回的值如下:
{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 来实现这个?


1
#FIRST: 这会导致崩溃... Numpy数组从0索引开始。"results[10,x]"会崩溃! #SECOND: 你应该将“function”更改为返回值而不是字典。似乎没有间隔(1,2,3,4,5是字典中的键)。没有理由使用字典作为稀疏数据结构。这只会减慢速度。 #THIRD: results[i][j] 应该是 results[i,j]! - sascha
你应该清楚地指出你的字典键是从0还是1开始。 - Anand S Kumar
Sascha:谢谢,我已经根据您的评论编辑了问题。 Anand:词典键从1开始,但如果使用其他数据结构更方便,我可以修改函数来返回信息! - Hernandcb
好的...如果你没有空缺,为什么不在method()中生成一个numpy数组或列表并返回它呢?这样就可以实现results[i,:] = result[:]!你看:了解method()确切产生的内容是很重要的。 - sascha
@Sascha:该方法()返回给定盒子长度的情况下覆盖图形所需的盒子数量,其中盒子长度为1到图形直径之间的每个值。因此,我认为返回包含{box_length:number_of_boxes}的字典是清晰明了的。但我也可以返回一个列表,在文档中澄清索引+1将对应于盒子大小,并且该位置上的值将是盒子的数量。 - Hernandcb
2个回答

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

@AnandSKumar 由于没有向 method 传递任何参数,因此每次的结果都是一个字典。 - Omid
我的猜测是method()只是OP用来表示在每次迭代中从方法获取字典的简单示例,实际方法及其调用可能会有很大不同。尽管如此,我还是会让OP澄清一下。 - Anand S Kumar
@Omid 这假设没有副作用。Method() 可以有自己的状态,例如随机生成器! - sascha
1
你的第二种方法和被删除的答案相同,这是行不通的,因为 - 你不能依赖result.values()以1-5的顺序返回结果,因为result是一个字典,它没有任何顺序。 - Anand S Kumar
1
@AnandSKumar,请查看备注。 - Omid
显示剩余7条评论

0

我会做出一些假设。

method() 每次调用都返回一个不同的字典,因此您需要迭代 results 的行。

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

我们都在使用 Python3,因此 keysvalues 返回可迭代对象。因此,我将使用 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

所以与您的代码的主要区别在于我逐行进行数组赋值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接