Numpy的Kronecker三角洲

时间:2017-11-24 16:18:33

标签: python arrays numpy

是否有一种方便的方法来初始化根据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)?

2 个答案:

答案 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]]])