Вероятно, самый изящный способ, который я мог придумать, - это произвольно перемешать ваш массив, а затем выполнить первое вхождение. Это должно быть довольно кратким.
Так что-то вроде:
np.random.shuffle(sampl)
x = np.ravel(np.where(sampl==1))[0]
или, как вы предложили, без перетасовки, это выглядело бы как
x = np.random.choice(np.ravel(np.where(sampl==1)))
Если подумать, я думаю, что метод choice
будет бесконечно быстрее, чем тасование.
Следующая проблема - крайние случаи. Как справиться с этим, зависит от того, какое поведение по умолчанию вы ожидаете. Если вы ожидаете, что в большинстве случаев условие повлечет за собой хотя бы одно попадание, вам следует обработать случай, когда нет попадания с исключением:
try:
x = np.random.choice(np.ravel(np.where(sampl==1)))
except:
# TODO
pass
Я бы настоятельно рекомендовал сделать это, если только вы редко найдете хит. Но не верь мне на слово ... время сам.
Другим вариантом было бы поставить условие, которое явно проверяет, что
np.size( np.where(sampl==1) ) > 0
прежде чем продолжить. Однако я бы предположил, что этот подход медленнее, чем try...except
.