由于 python 中的屏蔽,如何正确索引到大小不断变化的数组

How to properly index to an array of changing size due to masking in python

这是我在开发某些东西时 运行 遇到的一个问题,这是一个很难表述的问题。所以最好用一个简单的例子:

假设您有 4 个随机数生成器生成大小为 4 的数组:

[rng-0,  rng-1,   rng-2,   rng-3]
   |        |        |        | 
[val0,    val1,    val2,    val3]

我们的目标是遍历由这些 RNG 填充的“几代”数组,并迭代屏蔽掉输出最大值的 RNG。

所以一个例子可能是这样开始的:
mask = [False, False, False, False], arr = [0, 10, 1, 3],所以我们会屏蔽掉 rng-1。

那么下一次迭代可能是:mask = [False, True, False, False], arr = [2, 1, 9](在它被询问之前,是的arr必须随着每个被屏蔽的rng减小尺寸).在这种情况下,很明显 rng-3 应该被屏蔽掉(例如 mask[3] = True),但是由于 arr 现在的大小与 mask 不同,因此很难获得正确的结果用于设置掩码的索引(因为 arr 的最大值位于 arr 的索引 2,但相应的生成器是索引 3)。随着越来越多的生成器被屏蔽掉,这个问题变得越来越困难(在我的例子中,我正在处理大小为 ~30 的掩码)。

如果有帮助,这里是示例的 python 版本:

rng = np.random.RandomState(42)
mask = np.zeros(10, dtype=bool)  # True if generator is being masked
for _ in range(mask.size):
    arr = rng.randint(100, size=~mask.sum())
    unadjusted_max_value_idx = arr.argmax()
    adjusted_max_value_idx = unadjusted_max_value_idx + ????
    mask[adjusted_max_value_idx] = True

有什么好的方法可以将 arr 中最大值的索引映射到掩码中的相应索引吗? (即从 unadjusted_max_value_idx 移动到 adjusted_max_value_idx

#use a helper list
rng = np.random.RandomState(42)
mask = np.zeros(10, dtype=bool)  # True if generator is being masked
ndxLst=list(range(mask.size))
maskHistory=[]
for _ in range(mask.size):
    arr = rng.randint(100, size=(~mask).sum())
    unadjusted_max_value_idx = arr.argmax()
    adjusted_max_value_idx=ndxLst.pop(unadjusted_max_value_idx)
    mask[adjusted_max_value_idx] = True
    maskHistory.append(adjusted_max_value_idx)
print(maskHistory)
print(mask)