как создать модифицированную версию матрицы идентичности в python - PullRequest
0 голосов
/ 25 февраля 2020

Я хочу сгенерировать модифицированную версию матрицы тождеств, назовите ее C, так что Cii будет равен нулю до некоторого индекса i , остальное по-прежнему 1.

Я могу использовать грубую силу, чтобы установить Cii на 0, но я думаю, что это нехорошо.

Есть ли эффективные функции, которые я могу использовать это трудно найти.

Пример ниже: исходная единичная матрица для 3 * 3 равна

1 0 0
0 1 0
0 0 1

, я хочу изменить это на:

0 0 0
0 1 0
0 0 1

, поэтому i равно 0 в этом случае, хотите изменить Ckk, k переходит с [0, i] на 0.

Ответы [ 3 ]

3 голосов
/ 25 февраля 2020

np.diag делает 2-мерный массив из 1-й диагонали:

In [97]: np.diag((np.arange(6)>2).astype(int))                                                 
Out[97]: 
array([[0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 1]])

в основном то же, что и PPanzer, но генерирует диагональ другим способом. Подобная скорость.

1 голос
/ 25 февраля 2020

Вот одна из возможностей:

N = 5
k = 2

np.diag(np.bincount([k],None,N).cumsum())
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [0, 0, 0, 1, 0],
       [0, 0, 0, 0, 1]])

Обновление: быстрое решение:

out = np.zeros((N,N))  
out.reshape(-1)[(N+1)*k::N+1] = 1
0 голосов
/ 25 февраля 2020

Вы можете построить идентификационную матрицу NxN и присвоить ноль верхнему левому углу KxK:

 N,K = 10,3
 im  = np.identity(N)
 im[:K,:K] = 0

 print(im)

вывод:

[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]]

40% быстрее, чем у hpaulj, но не так быстро при Быстрое решение Пола Панцера (которое в 3 раза быстрее этого)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...