【发布时间】:2018-07-24 13:14:02
【问题描述】:
假设我有一个包含允许和禁止区域的网格。
import numpy as np
forbidden = np.array([False, False, False, False, False, False, True, True, True,
True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True,
True, True, True, False, False, False, False, False, False,
False, False, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, False, False, False,
False, False, False, False, False, False, False, False, False,
True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, True, True, True,
True, True, True, True, True, True, True, True, True,
True, True, True, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, True, True, True, True, True, True, True,
True, True, True, True, True, False])
现在,我在 (0, 149) 之间有一堆网格点。如果他们似乎在禁区,我想“将他们移到左边”直到他们离开禁区。
例如,
idx = 13
forbidden[idx] # is True, hence we want to move to the left
forbidden[5] # is False, and it is the "first index" where this is such
同时,
idx = 5
forbidden[idx] = # is False, so this index stays the way it is
因此,getCorrectIndex(13) == getCorrectIndex(5) == 5。
一种低效的编码方式:
def getCorrectIndex(idx, forbidden):
# this trusts that the forbidden[0] == False, which is Okay
for remove in range(0, idx):
if not forbidden[idx - remove]:
return idx - remove
对索引数组执行此操作的矢量化方法是最佳的,但如果没有那个愚蠢的循环,我什至无法想出正确的方法...我会很感激这里的任何指针!
【问题讨论】:
-
如果 0 和 4 之间的第一个值是
True,会发生什么?idx是3? -
@HaleemurAli 你可以相信第一个元素是
False
标签: python numpy vectorization