如何创建由子矩阵组成的矩阵

时间:2019-06-11 08:07:31

标签: numpy

我想创建一个由某些子矩阵组成的矩阵,或者由有关索引的某些条件定义元素。

例如

X = np.array(
[[0, 0, 1, 1, 1],
 [0, 0, 1, 1, 1],
 [1, 1, 0, 0, 1],
 [1, 1, 0, 0, 1],
 [1, 1, 1, 1, 0]]
)

其中i行和j-col满足以下条件

0 if 2k ≤ i < 2(k+1) and 2k ≤ j < 2(k+1)
1 otherwise

在上述情况下,k0, 1, 2...2也是要更改的参数,并且

所以,我最终需要的是

0 if nk ≤ i < n(k+1) nk ≤ j < n(k+1)
1 otherwise

我认为np.ix_可以满足这种需求,但是它需要一个循环结构(我讨厌循环)。

是否有一些不错的方法来生成此代码?

1 个答案:

答案 0 :(得分:0)

一种方法是像这样利用outer运算符的not_equal方法:

N = 17; k = 5
np.not_equal.outer(*2*(np.arange(N)//k,)).view('u1')
# array([[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
#        [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
#        [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
#        [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
#        [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
#        [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1],
#        [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1],
#        [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1],
#        [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1],
#        [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1],
#        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1],
#        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1],
#        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1],
#        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1],
#        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1],
#        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
#        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0]], dtype=uint8)