NumPy K-й диагональные индексы
Я хотел бы сделать арифметику с k-й диагональю numpy.матрица. Мне нужны эти показатели. Например, что-то вроде:
>>> 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
вот так:
- создание массивов значений индекса.
- получить значения Индекса daigonal вы хотите.
- вот оно! :)
такой:
>>> 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]
демо:
>>> 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]])