是否有一种方便的方法来初始化根据Kronecker delta定义的Numpy数组?在一个理想的世界中,会有一个叫做kron_delta的函数,这样如果我设置M = kron_delta('ij,kl',5),那么M将是一个5x5x5x5数组,其中M [i,j,k,l每当i = j且k = 1时,则= 1,否则为0。我的问题是是否存在像kron_delta这样的函数。
跟进:如果没有,是否还有一种方便的方法来初始化数组delta(ijk)(即,只要所有索引相等,nxnxn数组为1,否则为0)?
答案 0 :(得分:3)
使用numpy的einsum的替代解决方案:
n = 5
M = np.einsum('ij,kl->ijkl', np.eye(n,n), np.eye(n,n))
答案 1 :(得分:1)
您的具体示例可以这样完成
import numpy as np
n = 3
i,k = np.ogrid[:n, :n]
res = np.zeros((n,n,n,n), int)
res[i,i,k,k] = 1
res
array([[[[1, 0, 0],
[0, 1, 0],
[0, 0, 1]],
[[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, 1, 0],
[0, 0, 1]],
[[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, 1, 0],
[0, 0, 1]]]])
随后:
res3 = np.zeros((3,3,3),int)
i = np.arange(n)
res3[i,i,i] = 1
res3
array([[[1, 0, 0],
[0, 0, 0],
[0, 0, 0]],
[[0, 0, 0],
[0, 1, 0],
[0, 0, 0]],
[[0, 0, 0],
[0, 0, 0],
[0, 0, 1]]])