Заполнить диагональ массива не удалось
Я пытаюсь заполнить смещенные диагонали матрицы:
loss_matrix = np.zeros((125,125))
np.diagonal(loss_matrix, 3).fill(4)
ValueError: assignment destination is read-only
Два вопроса:
1) Без перебора индексов, как я могу установить диагонали смещения массива numpy?
2) Почему результат np.diagonal
только для чтения? Документация для numpy.diagonal ла гласит: "В NumPy 1.10 он вернет представление чтения / записи, а запись в возвращенный массив изменит ваш исходный массив".
np.__version__
'1.10.1'
2 ответа
Судя по обсуждению системы отслеживания проблем NumPy, похоже, что эта функция застряла в подвешенном состоянии, и они так и не смогли исправить документацию, чтобы сказать, что она была отложена.
Если вам нужна возможность записи, вы можете форсировать это. Это будет работать только на NumPy 1.9 и выше, так как np.diagonal
делает копию на более низких версиях:
diag = np.diagonal(loss_matrix, 3)
# It's not writable. MAKE it writable.
diag.setflags(write=True)
diag.fill(4)
В старой версии diagflat
строит массив по диагонали.
In [180]: M=np.diagflat(np.ones(125-3)*4,3)
In [181]: M.shape
Out[181]: (125, 125)
In [182]: M.diagonal(3)
Out[182]:
array([ 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4.,... 4.])
In [183]: np.__version__
Out[183]: '1.8.2'
Эффективно это делает это (работая из своего кода Python)
res = np.zeros((125, 125))
i = np.arange(122)
fi = i+3+i*125
res.flat[fi] = 4
То есть он находит сплющенные массивы, эквивалентные индексам диагонали.
Я также могу получить fi
с:
In [205]: i=np.arange(0,122)
In [206]: np.ravel_multi_index((i,i+3),(125,125))