首页 文章

动态构造numpy特殊矩阵

提问于
浏览
2

所以我的目标如下,给定矩阵 s 的大小,我试图创建一个如下所示的矩阵,但是对于大小 sxs

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

对于4x4的大小,它看起来如下所示:

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

因此,您可以观察到一种模式:有 s-1 个重叠的迷你 2x2 个矩阵 .

我正在考虑创建 2x2 一个矩阵然后使用动态引用(for循环?),如 B[:-1,:-1] = ones_matrix ,其中 B 是大小为 sxs 的零矩阵 . 但是我不知道如何在这里加入for循环,因为如果我们说 4x4 矩阵,那么我们必须以三种方式引用 BB[:-1,:-1] = ones_matrix, B[1:-1,1:-1] = ones_matrix, B[2:,2:]=ones_matrix . 我无法找到一种方法来动态地为 n -sized零矩阵做这件事 . 有没有其他方法可以做到这一点?

3 回答

  • 1

    方法#1:代替一堆2x2矩阵,可能更容易将它看作1的三个对角线并将它们结合起来:

    >>> s = 3
    >>> np.diag([1]*s,0) + np.diag([1]*(s-1),-1) + np.diag([1]*(s-1), 1)
    array([[1, 1, 0],
           [1, 1, 1],
           [0, 1, 1]])
    >>> s = 4
    >>> np.diag([1]*s,0) + np.diag([1]*(s-1),-1) + np.diag([1]*(s-1), 1)
    array([[1, 1, 0, 0],
           [1, 1, 1, 0],
           [0, 1, 1, 1],
           [0, 0, 1, 1]])
    

    方法#2 :(受Divankar的回答启发),我们可以考虑距离中心的距离:

    >>> s = 4
    >>> i,j = np.indices((s,s))
    >>> (abs(i-j) <= 1).astype(int)
    array([[1, 1, 0, 0],
           [1, 1, 1, 0],
           [0, 1, 1, 1],
           [0, 0, 1, 1]])
    

    方法#3:我们可以利用 triltriu 并做一些算术:

    >>> m = np.tril(np.ones((s,s)),1)
    >>> m * m.T
    array([[ 1.,  1.,  0.,  0.,  0.],
           [ 1.,  1.,  1.,  0.,  0.],
           [ 0.,  1.,  1.,  1.,  0.],
           [ 0.,  0.,  1.,  1.,  1.],
           [ 0.,  0.,  0.,  1.,  1.]])
    >>> m = np.tril(np.ones((s,s)),2)
    >>> m * m.T
    array([[ 1.,  1.,  1.,  0.,  0.],
           [ 1.,  1.,  1.,  1.,  0.],
           [ 1.,  1.,  1.,  1.,  1.],
           [ 0.,  1.,  1.,  1.,  1.],
           [ 0.,  0.,  1.,  1.,  1.]])
    
  • 3

    矢量化方法broadcasting -

    A = np.arange(s)
    out = ((A[:,None] < A+2) & (A[:,None] > A-2)).astype(int)
    

    样品运行 -

    In [60]: s = 3
        ...: A = np.arange(s)
        ...: out = ((A[:,None] < A+2) & (A[:,None] > A-2)).astype(int)
        ...: 
    
    In [61]: out
    Out[61]: 
    array([[1, 1, 0],
           [1, 1, 1],
           [0, 1, 1]])
    
    In [62]: s = 4
        ...: A = np.arange(s)
        ...: out = ((A[:,None] < A+2) & (A[:,None] > A-2)).astype(int)
        ...: 
    
    In [63]: out
    Out[63]: 
    array([[1, 1, 0, 0],
           [1, 1, 1, 0],
           [0, 1, 1, 1],
           [0, 0, 1, 1]])
    
  • 0

    你也可以使用sympy.Matrix:

    from sympy import Matrix
    Matrix(4, 4, lambda i,j: 1 if (-2<i-j<2) else 0)
    
    Matrix([
    [1, 1, 0, 0],
    [1, 1, 1, 0],
    [0, 1, 1, 1],
    [0, 0, 1, 1]])
    

相关问题