Я действительно не думаю, что в Numpy вы найдете что-то, что в точности соответствует тому, что вы просите, поэтому я решил предложить, какие оптимизации я мог бы придумать.
Есть несколько вещей, которые могут сделать это медленно. Во-первых, numpy.where()
довольно медленный, потому что он должен проверять каждое значение в массиве срезов (срез также генерируется для каждой строки), а затем генерировать массив значений. Лучшее, что вы можете сделать, если планируете выполнять этот процесс снова и снова на одной и той же матрице, - это сортировать каждую строку. Тогда вы просто используете бинарный поиск, чтобы найти, где начинаются положительные значения, и просто используете случайное число, чтобы выбрать значение из них. Конечно, вы также можете просто хранить индексы, с которых начинаются положительные значения, после нахождения их один раз с помощью бинарных поисков.
Если вы не планируете выполнять этот процесс много раз, то я бы порекомендовал использовать Cython для ускорения строки numpy.where. Cython позволит вам не разбивать строки и ускорить процесс в целом.
Мое последнее предложение - использовать random.choice, а не random.sample, если вы действительно не планируете выбирать размеры выборки больше 1.