python - 保留一个索引,以记录 if 语句在列表理解中传递了多少次
问题描述
我想要一个带有 1 和 0 的向量来检查向量中的元素是否为 1。如果它是 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., 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 以更改数组中元素的值。然后将 label+1 用于以下标签。
所以我想知道这是否可能,或者我应该坚持使用 for 循环。
解决方案
您可以使用迭代器执行相同操作并使用next()
:
import numpy as np
U = np.array([1., 0., 0., 1., 0., 0., 1., 0., 1., 0.])
c = iter(range(2, len(U)+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]
这也是另一种使用方式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]
推荐阅读
- android - Android-BLE - 将数据写入特征的问题
- java - 访问创建您当前所在的类的类中的方法
- python - 如何沿某个维度将元素添加到 PyTorch 张量?
- javascript - 如何从外部脚本中止 XMLHttpRequest.upload?
- node.js - Nodejs异步函数返回
- shell - WSL 中的第一个参数 GIMP 批处理阈值错误
- android - 如何在 Android drawables 中使用 > 和 />?
- python - 如何在 Python 3 中的多个异步方法之间创建依赖关系?
- spring-boot - SpringBoot 2.2 在请求“/*.jsp”时仍然显示白标错误
- c++ - 使用 VC++ (VS2017) 获取 SDL_mixer 的声音文件路径