代码之家  ›  专栏  ›  技术社区  ›  Triceratops

创建包含单位矩阵的多维数组

  •  0
  • Triceratops  · 技术社区  · 1 年前

    假设我有一个Numpy数组 n 索引,其中第一个 n-2 表示一些计数索引,最后2个索引表示一个正方形 MxM matrix。我想初始化这个结构,使其包含单位矩阵的副本。

    示例(此处N=3,M=2):

    A = numpy.zeros((3,2,2))
    for k in range(3):
         A[k,:,:] = numpy.eye(2)
    

    另一个例子(这里N=4,M=5):

    B = numpy.zeros((3,4,5,5))
    for k1 in range(3):
         for k2 in range(4):
             B[k1,k2,:,:] = numpy.eye(5)
    

    有没有一种更紧凑的方法来实现这一点,而不是(嵌套)循环?

    2 回复  |  直到 1 年前
        1
  •  1
  •   mozway    1 年前

    你可以 repeat :

    A = np.repeat(np.eye(2)[None], 3, axis=0)
    

    对于更复杂的情况,结合 reshape :

    extra = (3, 4)
    M = 5
    B = np.repeat(np.eye(M)[None], np.prod(extra), axis=0).reshape(extra+(M, M))
    

    或与 tile :

    extra = (3, 4)
    B = np.tile(np.eye(5), extra+(1, 1))
    

    或者,从 numpy.zeros 使用索引:

    B = np.zeros((3, 4, 5, 5))
    x = np.arange(B.shape[-1])
    B[..., x, x] = 1
    
        2
  •  0
  •   smp55    1 年前

    “紧凑”不是一个非常具体的术语,所以很难说哪种方法能满足要求。然而,一种方法是使用 numpy.tile , numpy.split ,以及 numpy.stack ,按照这个顺序。使用 tile 为了排列所有的单位矩阵, split 把它们分成一个列表,然后 stack 将它们放入一个多维数组中。这真的比循环更紧凑吗?谁知道呢,但你可以在一行中完成。

    你也可以使用列表理解,它不会消除循环,而是将其放在一行中。