Python Numpy-Kronecker三角矩阵
我想构建一个M×M矩阵,其中每个单元{ij}都是Kronecker delta&{ij}的函数 下面是使用for循环执行此操作的代码: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
# 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.]]