我想用不同的参数值执行一个函数。我有以下代码片段,效果非常好:
tau = np.arange(2,4.01,0.1)
R = []
P = []
T = []
L = []
D = []
E = []
Obj = []
for i, tenum in enumerate(tau):
[r, p, t, l, d, e, obj] = (foo.cvxEDA(edaN, 1./fs, tenum, 0.7, 10.0, 0.0008, 0.01))
R.append(r)
P.append(p)
T.append(t)
L.append(l)
D.append(d)
E.append(e)
Obj.append(obj)
但是,我想知道:有没有更简单的方法来实现这一目标?
我尝试过使用过
res.append(foo.cvxEDA(edaN, 1./fs, tenum, 0.7, 10.0, 0.0008, 0.01)
但res[1]
返回<generator object <genexpr> at 0x046E7698>
。
答案 0 :(得分:3)
tau = np.arange(2,4.01,0.1)
results = [[] for _ in range(7)]
for i, tenum in enumerate(tau):
data = foo.cvxEDA(edaN, 1./fs, tenum, 0.7, 10.0, 0.0008, 0.01)
for r,d in zip(results, data):
r.append(d)
r, p, t, l, d, e, _obj = results
答案 1 :(得分:3)
您可以将生成器对象转换为列表对象,只需将其传递给list()
函数,这样就可以做到你想要的了:
res = []
for i, tenum in enumerate(tau):
res.append(list(foo.cvxEDA(edaN, 1./fs, tenum, 0.7, 10.0, 0.0008, 0.01)))
列表理解更短:
res = [list(foo.cvxEDA(edaN, 1./fs, tenum, 0.7, 10.0, 0.0008, 0.01)) for i, tenum in enumerate(tau)]
无论哪种方式,这都会使你的转置与你想要的相比(将其视为一个矩阵)。您可以通过调用zip
来解决此问题:
res_tr = zip(*res)
R, P, T, L, D, E, Obj = res_tr
编辑:最短的是,您可以避免使用直接传递给zip()
的生成器表达式构建中间列表:
R, P, T, L, D, E, Obj = zip(*(list(foo.cvxEDA(edaN, 1./fs, tenum, 0.7, 10.0, 0.0008, 0.01)) for tenum in tau))
最后一点:在所有这些中,您可以替换&#34; for i, tenum in enumerate(tau)
&#34;用&#34; for tenum in tau
&#34;因为你似乎没有使用i
。