所以我的目标如下,给定矩阵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
矩阵,那么我们必须以三种方式引用B
:B[:-1,:-1] = ones_matrix, B[1:-1,1:-1] = ones_matrix, B[2:,2:]=ones_matrix
。我无法找到一种方法来动态地为n
大小的零矩阵做这件事。有没有其他方法可以做到这一点?
答案 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:我们可以利用tril
或triu
并做一些算术:
>>> 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)
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]])