Перестановка симметричного массива в Python

1

Я хочу иметь перестановку для этой симметричной матрицы, если мы переместим второй столбец в третий, вторая строка также должна перейти в третью строку.

array([[ 0.        ,  0.06377803,  0.1157737 ,  0.19542195],
       [ 0.06377803,  0.        ,  0.14754803,  0.23185761],
       [ 0.1157737 ,  0.14754803,  0.        ,  0.0843134 ],
       [ 0.19542195,  0.23185761,  0.0843134 ,  0.        ]])

Это код для перестановки в списке:

import numpy as np
x=[]
def perm(a, k=0):

    if k == len(a):
        x.extend(a)
#        print (a )


    else:
      for i in range(k, len(a)):
         a[k], a[i] = a[i] ,a[k]
         perm(a, k+1)
         a[k], a[i] = a[i], a[k]

perm([0,1,2,3])
a=np.asarray(x).reshape((24,4))
print(a)

Выход:

[[0 1 2 3]
 [0 1 3 2]
 [0 2 1 3]
 [0 2 3 1]
 [0 3 2 1]
 [0 3 1 2]
 [1 0 2 3]
 [1 0 3 2]
 [1 2 0 3]
 [1 2 3 0]
 [1 3 2 0]
 [1 3 0 2]
 [2 1 0 3]
 [2 1 3 0]
 [2 0 1 3]
 [2 0 3 1]
 [2 3 0 1]
 [2 3 1 0]
 [3 1 2 0]
 [3 1 0 2]
 [3 2 1 0]
 [3 2 0 1]
 [3 0 2 1]
 [3 0 1 2]]

Но я хочу иметь перестановку для вышеупомянутого массива, который равен 4 * 4. Для простоты, если у нас есть массив 3 * 3, нам нужно что-то вроде ниже, которое есть K! = 6, но когда k = 4, тогда мы должны получить k! который представляет собой 24 перестановки

Изображение 174551

  • 0
    Вы хотите сказать, что хотите переставить матрицу таким образом, чтобы она была симметричной?
  • 0
    Исправьте отступ и используйте возвращаемое значение вместо глобального.
Показать ещё 6 комментариев
Теги:
numpy
permutation

1 ответ

3
Лучший ответ
import numpy as np
from itertools import permutations

n = 3
a = np.arange(n**2).reshape(n, n)

for perm in permutations(range(a.shape[0])):
    b = np.zeros_like(a)
    b[:, :] = a[perm, :]
    b[:, :] = b[:, perm]
    print(b)

дает 6 следующих матриц:

[[0 1 2]
 [3 4 5]
 [6 7 8]]
[[0 2 1]
 [6 8 7]
 [3 5 4]]
[[4 3 5]
 [1 0 2]
 [7 6 8]]
[[4 5 3]
 [7 8 6]
 [1 2 0]]
[[8 6 7]
 [2 0 1]
 [5 3 4]]
[[8 7 6]
 [5 4 3]
 [2 1 0]]

Это вопрос?

  • 0
    Большое спасибо @ xdze2

Ещё вопросы

Сообщество Overcoder
Наверх
Меню