Как поменять местами элементы в массиве с вероятностью p?

#python #arrays #numpy #numpy-ndarray

#python #массивы #numpy #numpy-ndarray

Вопрос:

Предполагая, что у меня есть массив numpy a = np.random.randint(0,20,10) , я хотел бы переставить его элементы с вероятностью p , т. Е. Если p = 0.2 у каждого элемента есть 20% вероятность обмена позицией с другим элементом. Я знаю об этой numpy.random.permutate() функции, но это позволяет только переставлять все элементы в массиве. Можно ли это эффективно сделать на python?

Ответ №1:

Хитрость заключается в том, чтобы сначала выбрать, какие элементы будут кандидатами на участие в перестановке.

 import numpy as np

a = np.random.randint(0,20,10) # original array
p = 0.2

ix = np.arange(a.size)  # indexes of a
will_swap = np.random.random(a.size) <= p  # draw which elements will be candidates for swapping
after_swap = np.random.permutation(ix[will_swap]) # permute the canidadates
ix[will_swap] = after_swap # update ix with the swapped candidates
a = a[ix]
print(a) # --> [0 1 8 3 4 5 6 7 2 9]
 

Комментарии:

1. Этот ответ кажется прекрасным, но может быть немного неправильным в зависимости от того, что ожидает OP. Функция перестановки может оставить некоторые или все элементы в их исходном положении. Итак, если выбор означает, что элемент может перемещаться, это правильно. Если это означает must move, то это не совсем правильно.