#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, то это не совсем правильно.