Как перезаписать 2-D numpy несколько раз симметрично с заданным индексом? - PullRequest
1 голос
/ 26 апреля 2020

Я пытаюсь изменить значения в матрице a с заданной индексной матрицей d и матрицей e.

И матрица всегда должна быть симметричной.

Что я придумаю, это перезаписать первичную матрицу с заданным индексом, и попытайтесь сделать ее симметричной, затем go для другой перезаписи, пока не будет пройдена вся заданная индексная матрица. Это не эффективно.

Но я застрял с тем, как сделать его симметричным.

Например:

a = np.ones([4,4],dtype=np.object)         #the primal matrix
d = np.array([[1],
              [2],
              [0],
              [0]])             #the first index matrix
a[np.arange(a.shape[0])[:,None],d] =2      #the element change to 2 with the indexes shown in d matrix

Теперь результат:

a = np.array([[1 2 1 1]
              [1 1 2 1]
              [2 1 1 1]
              [2 1 1 1]])

После того, как сделать его симметричным (если a [i] [j] было выбрано в матрице d, a [j] [i] также следует изменить на 2, как это сделать).

ожидаемый результат должен быть:

a = np.array([[1 2 2 2]
              [2 1 2 1]
              [2 2 1 1]
              [2 1 1 1]])

Затем для еще одной перезаписи:

e = np.array([[0],[2],[1],[1]])
a[np.arange(a.shape[0])[:,None],e] =3

Теперь результат:

a = np.array([[3 2 2 2]
              [2 1 3 1]
              [2 3 1 1]
              [2 3 1 1]])

Сделать это симметричным, (I не знаю, как сделать эту часть) конечный результат должен быть: (переписать значения, если они были заданы 2 или 1 раньше)

a = np.array([[3 2 2 2]
              [2 1 3 3]
              [2 3 1 1]
              [2 3 1 1]])

Что я должен сделать, чтобы получить симметричную матрицу?

И есть ли в любом случае непосредственное изменение первичной матрицы a для получения окончательного результата? Более эффективным способом?

Заранее спасибо !!

1 Ответ

1 голос
/ 26 апреля 2020

Вы можете просто переключить первый и второй индексы и применить изменение, результат будет симметричным:

a[np.arange(a.shape[0])[:,None], d] = 2 
a[d, np.arange(a.shape[0])[:,None]] = 2 

вывод:

[[1 2 2 2]
 [2 1 2 1]
 [2 2 1 1]
 [2 1 1 1]]

То же самое с любым количеством других изменений :

a[np.arange(a.shape[0])[:,None], e] = 3
a[e, np.arange(a.shape[0])[:,None]] = 3

вывод:

[[3 2 2 2]
 [2 1 3 3]
 [2 3 1 1]
 [2 3 1 1]]
...