Матрица дельта Кронекера дельта - PullRequest
0 голосов
/ 06 ноября 2019

Я хочу построить матрицу M by M, где каждая ячейка_ {ij} является функцией дельты Кронекера & _ {ij}

Вот код для этого с использованием цикла for:

# Note: X is an M by M numpy array
def build_matrix(X):
   def kd(i, j):
     if i==j:
         return 1
     else :
         return 0

  m = np.zeros((len(X), len(X)))
  for row in range(len(X)):
      for colom in range(len(X)):
          m[row][colom] = kd(X[row], X[colom])
  return m

есть ли лучший, более питонский способ достижения этого?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Если вы хотите сравнить два вектора, тогда можно использовать np.meshgrid для трансляции вектора n в матрицу n x n. np.meshgrid(x,x) вернет две матрицы: первая с вектором, уложенным в строки, вторая - в столбцы. См. документы для получения дополнительной информации.

Тогда вы можете определить функцию как:

def kronecker_matrix(x,y):
  kmat = np.meshgrid(x,x)[0] == np.meshgrid(y,y)[1]
  return kmat.astype(np.int)   #kmat is a boolean, with .astype you pass it to an integer, if you like

#example:
kronecker_matrix(np.arange(5), np.arange(5))
>>array([[1, 0, 0, 0, 0],
       [0, 1, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [0, 0, 0, 1, 0],
       [0, 0, 0, 0, 1]])
0 голосов
/ 06 ноября 2019

Не уверен, что это более "питонический", но немного более короткий путь (при условии, что вы не хотите использовать np.eye, как уже упоминалось):

matrix = np.zeros((M,M))
for i in range(M):
    matrix[i,i] = 1

Теперь у вас есть объект (M от Mmatrix), который возвращает 0, если индекс строки и столбца не равны, и 1, если они равны.

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