如何从地图中获取值并将它们设置为 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,所以 keys
和 values
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
所以与您的代码的主要区别在于我一次为一行分配数组。
我有一个 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,所以 keys
和 values
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
所以与您的代码的主要区别在于我一次为一行分配数组。