Python Numpy-Kronecker三角矩阵

Python Numpy-Kronecker三角矩阵,python,numpy,Python,Numpy,我想构建一个M×M矩阵,其中每个单元{ij}都是Kronecker delta&{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

我想构建一个M×M矩阵,其中每个单元{ij}都是Kronecker delta&{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 column in range(len(X)):
          m[row][column] = kd(X[row], X[column])
  return m

是否有更好的-更具Python风格的方法来实现这一点?

如果您想要比较两个向量,那么一个选项是使用
np.meshgrid
n
向量广播到
nxn
矩阵
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]])

您可以将矩阵中的每个值映射到素数:

import numpy as np
a = np.random.randint(5, size=(5,5))
b = np.random.randint(5, size=(5,5))
print(a)
 
 ([[4, 1, 3, 4, 2],
   [1, 2, 2, 3, 0],
   [3, 1, 4, 4, 4],
   [2, 0, 4, 4, 1],
   [3, 2, 1, 3, 0]])

print(b)

 ([[4, 4, 0, 3, 2],
   [3, 1, 3, 4, 4],
   [0, 3, 2, 2, 0],
   [3, 2, 4, 4, 3],
   [0, 0, 3, 1, 2]])
在本例中,唯一不是素数的数字是4和0,因此我们将4改为5:

a[a==4]=5
b[b==4]=5
0到7:

a[a==0]=7
b[b==0]=7
然后: 印刷品(a)


eye返回一个单位矩阵,上面的函数并不总是返回一个单位矩阵。它取X[row_index]和X[colom_index]的值,如果它们相等,则返回一
 ([[5, 1, 3, 5, 2],
   [1, 2, 2, 3, 7],
   [3, 1, 5, 5, 5],
   [2, 7, 5, 5, 1],
   [3, 2, 1, 3, 7]])

print(b)

 ([[5, 5, 7, 3, 2],
   [3, 1, 3, 5, 5],
   [7, 3, 2, 2, 7],
   [3, 2, 5, 5, 3],
   [7, 7, 3, 1, 2]])

mat = a*b
print(mat)

 ([[25,  5, 21, 15,  4],
   [ 3,  2,  6, 15, 35],
   [21,  3, 10, 10, 35],
   [ 6, 14, 25, 25,  3],
   [21, 14,  3,  3, 14]])

mat_sq = np.sqrt(mat)
mat_sq[mat_sq == mat_sq.astype(int)] = 1
mat_sq[mat_sq != mat_sq.astype(int)] = 0
print(mat_sq)

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