Как сделать матрицу-симметрию точки c in Python - PullRequest
0 голосов
/ 06 марта 2020

У меня есть:

[[0, 0, 0, 0, 0]
 [0, 3, 4, 0, 0]
 [5, 2, 0, 0, 0] 
 [0, 0, 1, 0, 0] 
 [0, 0, 0, 0, 0]]

Я хочу получить центральную симметрию относительно произвольной точки, например [2,1], предполагая фон (= 0) в качестве «пустого» значения. Это может привести к:

  [[0, 0, 0, 0, 0]
 [1, 3, 4, 0, 0]
 [5, 2, 5, 0, 0] 
 [4, 3, 1, 0, 0] 
 [0, 0, 0, 0, 0]]

Схема вокруг произвольной центральной точки может иметь произвольную форму и числа. Я заглянул в библиотеки Numpy и Scipy, чтобы найти что-то из коробки, но без удачи. Есть ли какой-нибудь эффективный способ сделать это, возможно, используя Numpy или Scipy?

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Предположим, вы гарантируете, что выбранная точка действительна для создания квадратной матрицы 3x3 с выбранной точкой в ​​центре , и каждая противоположная позиция имеет только одно ненулевое значение, как в вашей образец. Вы можете использовать нарезку и np.rot90 и bitwise_or

a = np.array([[0, 0, 0, 0, 0],
 [0, 3, 4, 0, 0],
 [5, 2, 0, 0, 0],
 [0, 0, 1, 0, 0],
 [0, 0, 0, 0, 0]])

px, py = (2,1)
aa = a[px-1:px+2, py-1:py+2]

Out[2176]:
array([[0, 3, 4],
       [5, 2, 0],
       [0, 0, 1]])

a[px-1:px+2, py-1:py+2] = np.bitwise_or(aa, np.rot90(aa, 2))

Out[2178]:
array([[0, 0, 0, 0, 0],
       [1, 3, 4, 0, 0],
       [5, 2, 5, 0, 0],
       [4, 3, 1, 0, 0],
       [0, 0, 0, 0, 0]])
1 голос
/ 06 марта 2020

Это может быть достигнуто путем нарезки:

>>> A
array([[0, 0, 0, 0, 0],
       [0, 3, 4, 0, 0],
       [5, 2, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0]])

>>> A[:5,:3]+=A[4::-1,2::-1]
>>> A
array([[0, 0, 0, 0, 0],
       [1, 3, 4, 0, 0],
       [5, 4, 5, 0, 0],
       [4, 3, 1, 0, 0],
       [0, 0, 0, 0, 0]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...