У меня вопрос простой numpy. Как я могу извлечь и, следовательно, установить диагональ, имеющую «толщину», равную width
с постоянным значением? Я знаю функцию fill_diagonal
, которая заполняет основную диагональ заданным значением. Подобно тому, что я хочу заполнить главной диагональю и ее окружающими диагоналями. См. banded diagonal matrix.Извлечь и установить толщину диагонали матрицы numpy
Например:
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, но я бы сохранил это в качестве последней альтернативы.
Сегодня я узнал что-то новое ... Спасибо! – mg007
+1 Очень элегантный. – Jaime