我有一个二维 bool 值列表。我想从值为 False 的列表中选择一个随机索引。例如,给定以下列表:
[[True, False, False],
[True, True, True],
[False, True, True]]
有效的选择是:[0, 1]、[0, 2] 和 [2, 0]。
我可以保留一个有效索引列表,然后使用 random.choice 从中进行选择,但是保留一个变量并在每次基础列表仅针对这个变量更改时更新它似乎不符合 pythonic目的。
如果您的回答速度很快,则可加分。
请您参考如下方法:
我们可以使用像这样的 oneliner:
import numpy as np
from random import choice
choice(np.argwhere(~a))
使用 a bool 数组。
其工作原理如下:通过使用 ~a,我们取反数组的元素。接下来,我们使用 np.argwhere 构造一个 k×2 数组:一个数组,其中每一行都有两个元素:对于每个维度,对应值的值是值 False。
通过 choice(..) 我们因此选择了一个随机行。但是,我们不能直接使用它来访问元素。我们可以使用 tuple(..) 构造函数将其转换为元组:
>>> tuple(choice(np.argwhere(~a)))
(2, 0)
因此您可以使用以下方法获取元素:
t = tuple(choice(np.argwhere(~a)))
a[t]
当然,这并不奇怪:
>>> t = tuple(choice(np.argwhere(~a)))
>>> a[t]
False
