Python 如何从矩阵中选择特定的非对角带?

Python 如何从矩阵中选择特定的非对角带?,python,numpy,Python,Numpy,假设一个NxN方阵。我想选择一个宽度为w的频带,该频带与主对角线偏移k,如下例所示N=9,w=4,k=-1 元素的顺序应为。因此,基本上,相应的指数应该是np.tril\u指数(N,k=k)减去np.tril\u指数(N,k=k-w): 或者,也可以使用存储完整矩阵作为中间结果,并且仅适用于二维阵列: B = np.ravel(np.tril(M, k=k) - np.tril(M, k=k-w)) B[B.nonzero()] 我想知道是否有更有效和/或更简洁的方法来实现这一点 In [1

假设一个
NxN
方阵。我想选择一个宽度为
w
的频带,该频带与主对角线偏移
k
,如下例所示
N=9,w=4,k=-1

元素的顺序应为。因此,基本上,相应的指数应该是
np.tril\u指数(N,k=k)
减去
np.tril\u指数(N,k=k-w)

或者,也可以使用存储完整矩阵作为中间结果,并且仅适用于二维阵列:

B = np.ravel(np.tril(M, k=k) - np.tril(M, k=k-w))
B[B.nonzero()]
我想知道是否有更有效和/或更简洁的方法来实现这一点

In [19]: np.tri(6,6, dtype=bool)
Out[19]: 
array([[ True, False, False, False, False, False],
       [ True,  True, False, False, False, False],
       [ True,  True,  True, False, False, False],
       [ True,  True,  True,  True, False, False],
       [ True,  True,  True,  True,  True, False],
       [ True,  True,  True,  True,  True,  True]])
组合2个
tri
遮罩:

In [22]: np.tri(6,6, dtype=bool)&~np.tri(6,6,-3,dtype=bool)
Out[22]: 
array([[ True, False, False, False, False, False],
       [ True,  True, False, False, False, False],
       [ True,  True,  True, False, False, False],
       [False,  True,  True,  True, False, False],
       [False, False,  True,  True,  True, False],
       [False, False, False,  True,  True,  True]])

In [23]: np.where(Out[22])
Out[23]: 
(array([0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5]),
 array([0, 0, 1, 0, 1, 2, 1, 2, 3, 2, 3, 4, 3, 4, 5]))
np.tri
本质上是:

In [29]: np.greater_equal.outer(np.arange(4),np.arange(4))
Out[29]: 
array([[ True, False, False, False],
       [ True,  True, False, False],
       [ True,  True,  True, False],
       [ True,  True,  True,  True]])
In [30]: np.greater_equal(np.arange(4)[:,None],np.arange(4))
Out[30]: 
array([[ True, False, False, False],
       [ True,  True, False, False],
       [ True,  True,  True, False],
       [ True,  True,  True,  True]])
np.tril
仅将
where
应用于此

In [37]: np.greater_equal(np.arange(4)[:,None], np.arange(4)) & 
         np.less_equal(np.arange(-1,3)[:,None], np.arange(4))
Out[37]: 
array([[ True, False, False, False],
       [ True,  True, False, False],
       [False,  True,  True, False],
       [False, False,  True,  True]])
In [37]: np.greater_equal(np.arange(4)[:,None], np.arange(4)) & 
         np.less_equal(np.arange(-1,3)[:,None], np.arange(4))
Out[37]: 
array([[ True, False, False, False],
       [ True,  True, False, False],
       [False,  True,  True, False],
       [False, False,  True,  True]])