У меня простой вопрос. Как я могу извлечь и, следовательно, установить диагональ, имеющую «толщину», равную 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, но я бы оставил ее в качестве последней альтернативы.