我有一个简单的 numpy 问题。如何提取并因此设置具有“厚度”等于width
恒定值的对角线?我知道fill_diagonal
用给定值填充主对角线的函数。与此类似,我想填充主对角线及其周围的对角线。请参阅带状对角矩阵。
例如:
In [293]: a = np.random.randint(1, 100, (5,5)) % 2 == 0
In [294]: a
Out[294]:
array([[ True, True, False, False, False],
[ True, True, False, True, False],
[ True, True, False, False, True],
[False, False, False, True, False],
[False, False, False, False, True]], dtype=bool)
In [295]: fill_banded(a, val=True, width=3) # width must be odd number (?)
In [296]: a
Out[296]:
array([[ True, True, False, False, False],
[ True, True, True, True, False],
[ True, True, True, True, True],
[False, False, True, True, True],
[False, False, False, True, True]], dtype=bool)
到目前为止,我能够以fill_banded
以下方式实现(有效):
def fill_banded(a, val, width=1):
# TODO: Add some error checking
for i in range(width // 2):
a[range(0,a.shape[0]-(i+1)),range(i+1,a.shape[1])] = val
a[range(i+1,a.shape[0]),range(0,a.shape[1]-(i+1))] = val
np.fill_diagonal(a, val)
但我确信在 numpy / scipy 中有更好的方法。我可以在 Cython 中移动这个功能,但我会保留它作为最后的选择。