我有一个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是否有更合适/更有效的方法吗?
答案 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,因此keys
和values
会返回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
因此,与代码的主要区别在于我一次将数组赋值为一行。