动态构造numpy特殊矩阵

时间:2015-11-04 13:48:39

标签: python numpy matrix

所以我的目标如下,给定矩阵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

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

3 个答案:

答案 0 :(得分:3)

方法#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.]])

答案 1 :(得分:1)

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

答案 2 :(得分: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]])