NumPy k-й диагональный индекс

Я бы хотел сделать арифметику с k-й диагональю numpy.array. Мне нужны эти показатели. Например, что-то вроде:

>>> a = numpy.eye(2)
>>> a[numpy.diag_indices(a, k=-1)] = 5
>>> a
array([[ 1.,  0.],
       [ 5.,  1.]])

К сожалению, diag_indices возвращает только индексы, составляющие основную диагональ, поэтому в данный момент я делаю:

a += numpy.diag([5], -1)

Но это не кажется таким хорошим или крепким. : -)

Есть ли в numpy способ получить индексы, отличные от главной диагонали?

Ответы на вопрос(4)

Решение Вопроса

но эта версия также работает дляk = 0 (и не изменяет массивы, поэтому не нужно делать копию).

def kth_diag_indices(a, k):
    rows, cols = np.diag_indices_from(a)
    if k < 0:
        return rows[-k:], cols[:k]
    elif k > 0:
        return rows[:-k], cols[k:]
    else:
        return rows, cols

Создайте массивы значений индекса. Получите нужные значения индекса дайгона.Это оно! :)

Так

>>> import numpy as np
>>> rows, cols = np.indices((3,3))
>>> row_vals = np.diag(rows, k=-1)
>>> col_vals = np.diag(cols, k=-1)
>>> z = np.zeros((3,3))
>>> z[row_vals, col_vals]=1
>>> z
array([[ 0.,  0.,  0.],
       [ 1.,  0.,  0.],
       [ 0.,  1.,  0.]])

Индексыk диагональa можно вычислить с помощью

def kth_diag_indices(a, k):
    rowidx, colidx = np.diag_indices_from(a)
    colidx = colidx.copy()  # rowidx and colidx share the same buffer

    if k > 0:
        colidx += k
    else:
        rowidx -= k
    k = np.abs(k)

    return rowidx[:-k], colidx[:-k]

Demo:

>>> a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
>>> a[kth_diag_indices(a, 1)]
array([ 1,  7, 13, 19])
>>> a[kth_diag_indices(a, 2)]
array([ 2,  8, 14])
>>> a[kth_diag_indices(a, -1)]
array([ 5, 11, 17, 23])
Используйтеnumpy.diag(v, k=0)

k устанавливает диагональ от центра.

ie. k=0: "центр по умолчанию",k=(-1): «1 ряд слева от центра»,k=1: "1 строка справа от центра}

Затем выполняйте арифметику, как обычно.

Проверьте документы здесь: Np.diag ().

Примеры
In [3]: np.diag(np.arange(6), k=0)
Out[3]: 
array([[0, 0, 0, 0, 0, 0],
       [0, 1, 0, 0, 0, 0],
       [0, 0, 2, 0, 0, 0],
       [0, 0, 0, 3, 0, 0],
       [0, 0, 0, 0, 4, 0],
       [0, 0, 0, 0, 0, 5]])

In [4]: np.diag(np.arange(6), k=1)
Out[4]: 
array([[0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 2, 0, 0, 0],
       [0, 0, 0, 0, 3, 0, 0],
       [0, 0, 0, 0, 0, 4, 0],
       [0, 0, 0, 0, 0, 0, 5],
       [0, 0, 0, 0, 0, 0, 0]])

In [5]: np.diag(np.arange(6), k=-1)
Out[5]: 
array([[0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [0, 1, 0, 0, 0, 0, 0],
       [0, 0, 2, 0, 0, 0, 0],
       [0, 0, 0, 3, 0, 0, 0],
       [0, 0, 0, 0, 4, 0, 0],
       [0, 0, 0, 0, 0, 5, 0]])
 Stefan19 янв. 2017 г., 12:34
Почему бы нет? Создайте матрицу с единицами на k-й диагонали и используйте ее для индексации исходной матрицы.
 K3---rnc07 авг. 2013 г., 00:22
да, я знаю, как построить новый диагональная матрица. Но ваш метод выше не применяется, когда мне нужно изменить существующий матрица.

Ваш ответ на вопрос