Python 为if语句在列表中传递的次数保留索引
我想要一个有1和0的向量来检查向量中的元素是否为1。如果它是一个,我想把这个元素标记为2,下一个等于3,以此类推。。 这很容易通过for循环实现Python 为if语句在列表中传递的次数保留索引,python,if-statement,list-comprehension,Python,If Statement,List Comprehension,我想要一个有1和0的向量来检查向量中的元素是否为1。如果它是一个,我想把这个元素标记为2,下一个等于3,以此类推。。 这很容易通过for循环实现 x=np.array([1., 0., 0., 1., 0., 0., 1., 0., 1., 0.]) def label(vector): U=np.copy(vector) l=2 for i in range(len(U[:])): if occupied(U[i]): U[i]=l l+=1 retu
x=np.array([1., 0., 0., 1., 0., 0., 1., 0., 1., 0.])
def label(vector):
U=np.copy(vector)
l=2
for i in range(len(U[:])):
if occupied(U[i]):
U[i]=l
l+=1
return U
然后
label(x)
返回
数组([2,0,0,3,0,0,0,4,0,5,0.]))
然而,由于数组变得更大,最终成为矩阵,我认为使用列表理解是个好主意
def count_clusters(vector):
U=np.copy(vector)
label=2
U[:] = [label, label+=1 if el==1. else el for el in U[:]]
return U
应该是这样的。
当然,问题是在列表理解中同时执行label+=1,以及更改数组中元素的值。然后将标签+1用于以下标签
所以我想知道这是否可能,或者我应该坚持使用for循环。您可以使用迭代器并使用
next()
:
此外,这也是使用itertools.count的另一种方法:
import numpy as np
from itertools import count
U = np.array([1., 0., 0., 1., 0., 0., 1., 0., 1., 0.])
c = count(2)
result = [float(next(c)) if x == 1 else x for x in U]
# [2.0, 0.0, 0.0, 3.0, 0.0, 0.0, 4.0, 0.0, 5.0, 0.0]
您可以使用迭代器执行同样的操作,并使用next()
:
此外,这也是使用itertools.count的另一种方法:
import numpy as np
from itertools import count
U = np.array([1., 0., 0., 1., 0., 0., 1., 0., 1., 0.])
c = count(2)
result = [float(next(c)) if x == 1 else x for x in U]
# [2.0, 0.0, 0.0, 3.0, 0.0, 0.0, 4.0, 0.0, 5.0, 0.0]
没有优化的速度,但有趣,没有numpy
def label(vector):
return [sum(vector[:i+1]) * x for i, x in enumerate(vector)]
assert label([1, 0, 0, 1, 0, 1]) == [1, 0, 0, 2, 0, 3]
努比也是如此
import numpy as np
def label(vector):
return np.cumsum(vector) * vector
assert (label([1, 0, 0, 1, 0, 1]) == np.array([1, 0, 0, 2, 0, 3])).all()
没有优化的速度,但有趣,没有numpy
def label(vector):
return [sum(vector[:i+1]) * x for i, x in enumerate(vector)]
assert label([1, 0, 0, 1, 0, 1]) == [1, 0, 0, 2, 0, 3]
努比也是如此
import numpy as np
def label(vector):
return np.cumsum(vector) * vector
assert (label([1, 0, 0, 1, 0, 1]) == np.array([1, 0, 0, 2, 0, 3])).all()
这很有效。当我有两个相邻的语句时,如何添加第二个语句。右边的标签与左边的标签相同,但没有提高标签。嗨,原来的问题得到了回答。你可以发布一个全新的问题来进一步提问。如果您觉得有帮助,请按答案左侧的勾号,将有帮助的答案标记为已接受。此操作有效。当我有两个相邻的语句时,如何添加第二个语句。右边的标签与左边的标签相同,但没有提高标签。嗨,原来的问题得到了回答。你可以发布一个全新的问题来进一步提问。如果您觉得有用,请按答案左侧的勾号,将有用的答案标记为已接受。