Python 使用numpy生成特定矩阵

Python 使用numpy生成特定矩阵,python,numpy,matrix,Python,Numpy,Matrix,假设n=4: 然后我想生成以下矩阵: 1 0 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 1 0 0 1 1 0 1 0 0 1 0 0 1 1 0 1 1 1 0 0 0 0 1 0 0 1 1 0 1 1 1 这可以通过水平附加3个矩阵(A0,A1,A2)得到 如果我是= 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 然后: 如何使用numpy有效地实现这一点 编辑: 当n=3表示ex时 我会变成 0 0 1 1 0 0 0 1 0 期

假设n=4:

然后我想生成以下矩阵:

1 0 0 0  1 0 0 1  1 0 1 1
0 1 0 0  1 1 0 0  1 1 0 1
0 0 1 0  0 1 1 0  1 1 1 0
0 0 0 1  0 0 1 1  0 1 1 1
这可以通过水平附加3个矩阵(A0,A1,A2)得到

如果我是=

0 0 0 1
1 0 0 0
0 1 0 0
0 0 1 0
然后:

如何使用numpy有效地实现这一点

编辑:

当n=3表示ex时

我会变成

0 0 1
1 0 0
0 1 0

期望的结果将是A0附加到A1中,使用一些列表理解(我假设你知道这个概念,否则请用谷歌搜索它,在这种情况下非常有用)和
np.linalg.matrix\u power
np.sum
np.concatenate

In [47]: n = 4
In [48]: np.concatenate(
    ...:     [
    ...:         np.sum(
    ...:             [np.linalg.matrix_power(I, i) for i in range(exp+1)],
    ...:             axis=0  # sum them correct over the axis not the whole data
    ...:         )
    ...:         for exp in range(n-1)
    ...:     ],
    ...:     axis=1  # concat horizontal not vertical
    ...: )
Out[48]:
array([[1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1],
       [0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1],
       [0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0],
       [0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1]])
这也可与其他
n
值一起使用:

In [49]: n = 5
In [50]: np.concatenate(
    ...:     [
    ...:         np.sum([np.linalg.matrix_power(I, i) for i in range(exp+1)], axis=0)
    ...:         for exp in range(n-1)
    ...:     ], axis=1)
Out[50]:
array([[1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1],
       [0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1],
       [0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1],
       [0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1]])

In [51]: n = 3
In [52]: np.concatenate(
    ...:     [
    ...:         np.sum([np.linalg.matrix_power(I, i) for i in range(exp+1)], axis=0)
    ...:         for exp in range(n-1)
    ...:     ], axis=1)
Out[52]:
array([[1, 0, 0, 0, 1, 0, 0, 1],
       [0, 1, 0, 0, 1, 1, 0, 0],
       [0, 0, 1, 0, 0, 1, 1, 0],
       [0, 0, 0, 1, 0, 0, 1, 1]])
编辑: 您可以使用eye生成所需的
I

In [68]: n=3

In [69]: I = np.eye(n, k=-1) + np.eye(n, k=n-1)

In [70]: I
Out[70]:
array([[0., 0., 1.],
       [1., 0., 0.],
       [0., 1., 0.]])

您可以使用模运算符:

>>> n = 4
>>> i,j,k = np.ogrid[:n, :n-1, :n]
>>> ((j-i+k)%n <= j).reshape(n, -1).view(np.int8)
array([[1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1],
       [0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1],
       [0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0],
       [0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1]], dtype=int8)

有没有一种很好的方法可以在不使用np的情况下在结果前面加上(0;0;0;0)并附加(1;1;1)呢。concatenate@SamCoutteau每列或每列
4x4
?一列
>>> n = 4
>>> i,j,k = np.ogrid[:n, :n-1, :n]
>>> ((j-i+k)%n <= j).reshape(n, -1).view(np.int8)
array([[1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1],
       [0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1],
       [0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0],
       [0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1]], dtype=int8)
>>> i, jk = np.ogrid[:n, :n*n - n + 2]
>>> j, k = divmod(jk + n - 1, n)
>>> print(((j-i+k-1)%n < j).view(np.int8))
[[0 1 0 0 0 1 0 0 1 1 0 1 1 1]
 [0 0 1 0 0 1 1 0 0 1 1 0 1 1]
 [0 0 0 1 0 0 1 1 0 1 1 1 0 1]
 [0 0 0 0 1 0 0 1 1 0 1 1 1 1]]