Сделать бинарный массив симметричным c - NumPy / Python - PullRequest
1 голос
/ 22 апреля 2020

Как преобразовать несимметричную c numpy матрицу в симметричную c матрицу?

запрос: если элемент a [i] [j] верхнего треугольника ( выше диагонали) равен 1, элемент нижнего треугольника a [j] [i] должен быть изменен на 1.

То же самое для нижнего треугольника, если a [i] [j] = 1, элемент симметрии c a [j] [i] в ​​верхнем треугольнике должен быть равен 1.

Просто позаботьтесь об изменении элемента с 0 на 1, не меняйте его с 0 на 1.

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

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

Например:

a= np.array ([[0, 0, 1, 0, 1],
              [0, 0, 0, 1, 1],
              [0, 0, 0, 1, 1],
              [1, 1, 0, 0, 0],
              [1, 1, 0, 1, 0]])

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

a= np.array ([[0, 0, 1, 1, 1],
              [0, 0, 0, 1, 1],
              [1, 0, 0, 1, 1],
              [1, 1, 1, 0, 1],
              [1, 1, 1, 1, 0]])

1 Ответ

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

Один путь чисто с masking -

In [40]: m = a==1

In [41]: (m | m.T).view('i1')
Out[41]: 
array([[0, 0, 1, 1, 1],
       [0, 0, 0, 1, 1],
       [1, 0, 0, 1, 1],
       [1, 1, 1, 0, 1],
       [1, 1, 1, 1, 0]], dtype=int8)

Другой с дополнением -

In [55]: ((a.T + a)>0).view('i1')
Out[55]: 
array([[0, 0, 1, 1, 1],
       [0, 0, 0, 1, 1],
       [1, 0, 0, 1, 1],
       [1, 1, 1, 0, 1],
       [1, 1, 1, 1, 0]], dtype=int8)

Другой с просто bitwise-OR-ing -

In [57]: (a.T | a)
Out[57]: 
array([[0, 0, 1, 1, 1],
       [0, 0, 0, 1, 1],
       [1, 0, 0, 1, 1],
       [1, 1, 1, 0, 1],
       [1, 1, 1, 1, 0]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...