我正在尝试找到掩盖段的索引。例如:
mask = [1, 0, 0, 1, 1, 1, 0, 0]
segments = [(0, 0), (3, 5)]
当前的解决方案看起来像这样(并且 非常 慢,因为我的掩码包含数百万个数字):
segments = []
start = 0
for i in range(len(mask) - 1):
e1 = mask[i]
e2 = mask[i + 1]
if e1 == 0 and e2 == 1:
start = i + 1
elif e1 == 1 and e2 == 0:
segments.append((start, i))
有什么办法可以用numpy有效地做到这一点?
我设法对google进行的唯一操作是numpy.ma.notmasked_edges,但它看起来不像我所需要的。
这是一种方法-
def start_stop(a, trigger_val):
# "Enclose" mask with sentients to catch shifts later on
mask = np.r_[False,np.equal(a, trigger_val),False]
# Get the shifting indices
idx = np.flatnonzero(mask[1:] != mask[:-1])
# Get the start and end indices with slicing along the shifting ones
return zip(idx[::2], idx[1::2]-1)
样品运行-
In [216]: mask = [1, 0, 0, 1, 1, 1, 0, 0]
In [217]: start_stop(mask, trigger_val=1)
Out[217]: [(0, 0), (3, 5)]
用它来获得0s
-
In [218]: start_stop(mask, trigger_val=0)
Out[218]: [(1, 2), (6, 7)]
在计时100000x
扩大命令datasize -
In [226]: mask = [1, 0, 0, 1, 1, 1, 0, 0]
In [227]: mask = np.repeat(mask,100000)
# Original soln
In [230]: %%timeit
...: segments = []
...: start = 0
...: for i in range(len(mask) - 1):
...: e1 = mask[i]
...: e2 = mask[i + 1]
...: if e1 == 0 and e2 == 1:
...: start = i + 1
...: elif e1 == 1 and e2 == 0:
...: segments.append((start, i))
1 loop, best of 3: 401 ms per loop
# @Yakym Pirozhenko's soln
In [231]: %%timeit
...: slices = np.ma.clump_masked(np.ma.masked_where(mask, mask))
...: result = [(s.start, s.stop - 1) for s in slices]
100 loops, best of 3: 4.8 ms per loop
In [232]: %timeit start_stop(mask, trigger_val=1)
1000 loops, best of 3: 1.41 ms per loop
问题内容: 我有一个称为dists的距离数组。我想选择两个值之间的距离。我编写了以下代码行: 但是,这仅针对条件选择 如果我使用临时变量按顺序执行命令,则可以正常工作。为什么上面的代码不起作用,如何使它起作用? 干杯 问题答案: 在 您的特定情况下 ,最好的方法 是 将两个条件更改为一个条件: 它仅创建一个布尔数组,在我看来是更易于阅读,因为它说, 是内部的还是?(尽管我将重新定义为您感兴趣的区域
问题内容: 我正在寻找用numpy中的NaN替换数字,并正在寻找类似numpy.nan_to_num的函数,除非相反。 由于每个数组都可以具有唯一定义的NoDataValue,因此该数字可能会随着处理不同的数组而改变。我看到人们使用字典,但是数组很大,并且充满了正负浮点数。我怀疑尝试将所有这些加载到任何东西以创建密钥的效率不高。 我尝试使用以下内容和numpy要求我使用any()或all()。我意
问题内容: 我需要以以下方式进行计算(旧版代码): 我想它可以在python-2.x中工作),但是在python-3.x中不工作(它返回错误)。 如何使其在python-3.x中工作? 编辑:错误消息(Python 3.6.3): 问题答案: 该文档指出: 如果和被赋予与输入的数组是1-d,相当于:: 那么,为什么会看到错误?举个简单的例子: 到现在为止还挺好。首先检查,结果为。该代码不会尝试进行
定义 用于弹层等需要遮挡底部内容。 图片展示 代码演示 import Mask from 'pile/dist/components/mask' <Mask transparent={true} /> 属性 参数 描述 数据类型 默认值 transparent 是否透明(true:是,false:否) bool false hidden 是否隐藏(true:是,false:否) bool
介绍 创建一个遮罩层,用于强调特定的页面元素,并阻止用户进行其他操作。 引入 import { createApp } from 'vue'; import { Overlay } from 'vant'; const app = createApp(); app.use(Overlay); 代码演示 基础用法 <van-button type="primary" text="显示遮罩层" @
在popover、侧滑菜单等界面,经常会用到蒙版遮罩;比如popover弹出后,除popover控件外的其它区域都会遮罩一层蒙版,用户点击蒙版不会触发蒙版下方的逻辑,而会关闭popover同时关闭蒙版;再比如侧滑菜单界面,菜单划出后,除侧滑菜单之外的其它区域都会遮罩一层蒙版,用户点击蒙版会关闭侧滑菜单同时关闭蒙版。 遮罩蒙版常用的操作包括:创建、显示、关闭,如下代码: var mask = mui