我有一个数组y
,其值为0或1。然后我有一个数组yp
,其值在0到1之间。两个数组的长度相同。>
如果y
中的条目为1,那么我想将相应的yp
附加到列表中,否则我想附加1-yp
:
y = [1,1,1,0,0]
yp = [0.1, 0.2, 0.3, 0.4, 0.5]
x = []
for idx, i in enumerate(y):
if i:
x.append(yp[idx])
else:
x.append(1-yp[idx])
是否有更短的方法用Python编写代码,也许没有for循环?
答案 0 :(得分:3)
您可以将列表理解与zip
一起使用,以同时遍历两个列表:
>>> y = [1,1,1,0,0]
>>> yp = [0.1, 0.2, 0.3, 0.4, 0.5]
>>> [b if a else 1 - b for a, b in zip(y, yp)]
[0.1, 0.2, 0.3, 0.6, 0.5]
答案 1 :(得分:2)
如果我对您的理解正确,也许您正在寻找类似的东西?
for idx, i in enumerate(y):
x.append(yp[idx]) if i else x.append(1-yp[idx])
更像是三元运算法吗?
参考:http://book.pythontips.com/en/latest/ternary_operators.html
答案 2 :(得分:2)
如果您的列表很长,那么使用numpy会更有效:
y, yp = map(np.asarray, (y, yp) # convert to an array
x = y * yp + (1 - y) * (1 - yp)
上面的代码解释如下:
a = y * yp
:结果与y
(和yp
)长度相同的数组,其中1 * yp
,其中y = 1
和0
,其中y = 0
。b = (1 - y) * (1 - yp)
:产生一个数组,其中包含1-yp
,其中y=0
和0
,其中y = 1
。a + b
是成对的总和,可以产生预期的结果。答案 3 :(得分:1)
您正在要求列表理解(您称其为“单线”?),例如:
y = [1,1,1,0,0]
yp = [0.1, 0.2, 0.3, 0.4, 0.5]
l=[yp[i] if y[i]==1 else 1-yp[i] for i in range(len(y))]
给你:
>>> l
[0.1, 0.2, 0.3, 0.6, 0.5]