我有一个python列表(例如lst = [2, 3, 5]
)。对应于lst
的每个元素,我想以以下方式构造一个numpy矩阵:它应该是与lst
的所考虑元素大小相同的正方形数组,并应填充为该元素的平方值。
这是我目前正在解决此问题的方式:
import numpy as np
lst = [2,3,5]
for i in range(len(lst)):
globals()['mat'+str(lst[i])] = np.full( (lst[i],lst[i]), lst[i]**2 )
print globals()['mat'+str(2)]
print " "
print globals()['mat'+str(3)]
print " "
print globals()['mat'+str(5)]
[[4 4]
[4 4]]
[[9 9 9]
[9 9 9]
[9 9 9]]
[[25 25 25 25 25]
[25 25 25 25 25]
[25 25 25 25 25]
[25 25 25 25 25]
[25 25 25 25 25]]
在不使用全局变量的情况下执行此任务的有效方法是什么?
答案 0 :(得分:2)
无论您如何命名或生成阵列,这里都没有效率问题。无论命名如何,每个数组都必须使用np.full
。创建数组后,可以将其收集在列表,字典中或将其分配给变量。
我将这些数组收集在一个列表中:
In [212]: lst = [2,3,5]
In [213]: lst1 = [np.full((i,i),i**2) for i in lst]
In [214]: lst1
Out[214]:
[array([[4, 4],
[4, 4]]), array([[9, 9, 9],
[9, 9, 9],
[9, 9, 9]]), array([[25, 25, 25, 25, 25],
[25, 25, 25, 25, 25],
[25, 25, 25, 25, 25],
[25, 25, 25, 25, 25],
[25, 25, 25, 25, 25]])]
如果必须分配名称,请使用类似以下内容的
:In [215]: mat2, mat3, mat5 = lst1
In [216]: mat3
Out[216]:
array([[9, 9, 9],
[9, 9, 9],
[9, 9, 9]])
该globals()[]
技巧可行,但不是良好的Python编程实践。它看起来更像是BASIC领域的产物,而不是惯用的Python。将内容收集在列表和词典中,而不是动态生成的全局变量中。
说到字典,我们可以使用以下方法将列表转换为一个:
In [217]: adict = {f'mat{i}': x for i,x in zip(lst, lst1)}
In [218]: adict
Out[218]:
{'mat2': array([[4, 4],
[4, 4]]), 'mat3': array([[9, 9, 9],
[9, 9, 9],
[9, 9, 9]]), 'mat5': array([[25, 25, 25, 25, 25],
[25, 25, 25, 25, 25],
[25, 25, 25, 25, 25],
[25, 25, 25, 25, 25],
[25, 25, 25, 25, 25]])}
(这里我使用的是新的f-literal
字符串语法。)