Случайное перемешивание массива, но с фиксированной диагональю - PullRequest
1 голос
/ 21 января 2020

Я определил массив, который выглядит следующим образом:

A = np.array([[1,2,3], [4,1,5], [6,7,1]])

Я хотел бы случайным образом перемешать его, но сохранить фиксированные цифры 1 на диагонали. Когда я делаю

B = [0,1,2]
np.random.shuffle(B)

, все элементы перемешиваются, включая 1 по диагонали.

Кто-нибудь знает решение для этого?

Спасибо!

1 Ответ

0 голосов
/ 21 января 2020

Одним из способов будет использование masking -

m = ~np.eye(len(A), dtype=bool) # mask of non-diagonal elements

# Extract non-diagonal elements as a new array and shuffle in-place
Am = A[m]
np.random.shuffle(Am)

# Assign back the shuffled values into non-diag positions of input
A[m] = Am

Другим способом будет создание сглаженных индексов, а затем перемешивание и присвоение -

idx = np.flatnonzero(m)
A.flat[idx] = A.flat[np.random.permutation(idx)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...