Python 为if语句在列表中传递的次数保留索引

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

我想要一个有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
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()

这很有效。当我有两个相邻的语句时,如何添加第二个语句。右边的标签与左边的标签相同,但没有提高标签。嗨,原来的问题得到了回答。你可以发布一个全新的问题来进一步提问。如果您觉得有帮助,请按答案左侧的勾号,将有帮助的答案标记为已接受。此操作有效。当我有两个相邻的语句时,如何添加第二个语句。右边的标签与左边的标签相同,但没有提高标签。嗨,原来的问题得到了回答。你可以发布一个全新的问题来进一步提问。如果您觉得有用,请按答案左侧的勾号,将有用的答案标记为已接受。