Заполнить диагональ массива не удалось

Я пытаюсь заполнить смещенные диагонали матрицы:

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))
Другие вопросы по тегам