19

numpy.arrayのk番目の対角線を使用して算術演算を実行したいと思います。それらのインデックスが必要です。たとえば、次のようになります。

>>> 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)

しかし、それはそれほど素晴らしいとは思えません。:-)

主対角線以外のインデックスを取得する方法はありますか?

4

6 に答える 6

17

少し遅れていますが、このバージョンも機能し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
于 2013-08-06T13:29:21.613 に答える
9

方法は次のとおりです。

  1. インデックス値の配列を作成します。
  2. 必要なdaigonalインデックス値を取得します。
  3. それでおしまい!:)

このような:

>>> 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.]])
于 2012-06-07T08:05:36.550 に答える
4

の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])
于 2012-06-07T12:00:15.147 に答える
2

したがって、np.diag_indices()にはnp.triu_indices()がk番目の対角線/三角形を取得するのと同じ機能がないため、別のアプローチは、np.eye(n、k)を使用して1のnxn行列を作成することです。 k番目の対角線上で、np.whereを使用して、1が配置されている場所のインデックスのタプルを抽出します。

したがって、これは次の方法で実行できます。

T = np.where(np.eye(5,k=-1) == 1)

これは、場合によっては過剰になる可能性のあるアイマトリックスの追加の割り当てですが、簡単なワンライナーです。

于 2021-01-03T17:28:51.373 に答える
1

別の解決策があります。np.eyeで行列Eを作成します。次のように主対角線を変更するだけです。次に、目のkパラメータを使用してさらに2つの行列を作成します。最後に、すべての行列を一緒に追加するだけです。

E = np.eye(5)
E = E*2
F = -1*np.eye(len(E),k=1)
G = -1*np.eye(len(E),k=-1)

E = E+F+G
print(E)
于 2020-05-11T14:11:21.810 に答える
-1

使用するnumpy.diag(v, k=0)

ここで、 kは中心からの対角位置を設定します。

すなわち。{ 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]])
于 2013-08-06T13:55:48.033 に答える