Если p мало, вы можете сэкономить много времени, используя numpy.random.geometric
, чтобы обеспечить выборку расстояний между изменяемыми элементами.
Простой проход по массиву ary:
from numpy.random import geometric
index = -1
while True:
index += geometric(0.01)
if index >= len(ary):
break
ary[ind] = # compute new value
Функции распределения Numpy могут создавать массив возвращаемых значений, поэтому, пока p мало, возможно, даже быстрее получить все значения шага одновременно:
from numpy import cumsum
from numpy.random import geometric
for index in cumsum(geometric(p, size=int(len(ary) * p * 1.1))):
if index < len(ary):
ary[index] = # compute new value
1.1 - выдумкафактор, чтобы убедиться, что достаточно выборок из геометрического распределения.Для больших массивов это должно быть хорошо, но это не гарантировано.Лучшим (хотя и более сложным) решением было бы создание сэмплов, скажем, 10000, и продолжайте делать это до тех пор, пока вам не удастся добраться до конца массива.