Вот еще один хороший способ сделать это.Если вы хотите одномерное представление главной диагонали массива, используйте:
A.ravel()[:A.shape[1]**2:A.shape[1]+1]
Для i-го супердиагонального использования:
A.ravel()[i:max(0,A.shape[1]-i)*A.shape[1]:A.shape[1]+1]
Для i-го субдиагонального использования:
A.ravel()[A.shape[1]*i:A.shape[1]*(i+A.shape[1]):A.shape[1]+1]
Или вообще, для i-й диагонали, где главная диагональ равна 0, субдиагонали отрицательны, а супердиагонали положительны, используйте:
A.ravel()[max(i,-A.shape[1]*i):max(0,(A.shape[1]-i))*A.shape[1]:A.shape[1]+1]
Это просматривает , а не копии, поэтому они будут работать быстрее для извлечения диагонали, но любые изменения, внесенные в новый объект массива, будут применяться к исходному массиву.На моей машине они работают быстрее, чем функция fill_diagonal при установке постоянной основной диагонали, но это не всегда так.Их также можно использовать для назначения массива значений диагонали, а не только константе.
Примечания: для небольших массивов может быть быстрее использовать атрибут flat
массива NumPy.Если скорость является основной проблемой, возможно, стоит сделать A.shape[1]
локальной переменной.Кроме того, если массив не является смежным, ravel()
вернет копию, поэтому для присвоения значений выделенному срезу необходимо будет творчески срезать исходный массив, использованный для генерации выделенного среза (если он смежный) или использовать атрибут flat
.
Кроме того, изначально планировалось, что в NumPy 1.10 и более поздних версиях метода диагональных массивов будет возвращаться представление вместо копии.Это изменение еще не было сделано, но, надеюсь, в какой-то момент этот трюк, чтобы получить представление, больше не будет необходим.См http://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.diagonal.html