簡體   English   中英

NumPy 第 k 個對角線索引

[英]NumPy k-th diagonal indices

我想用 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)

但這似乎並不那么好或健壯。 :-)

numpy 有沒有辦法獲取主對角線以外的索引?

有點晚了,但這個版本也適用於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

這里有一個方法:

  1. 創建索引值數組。
  2. 獲取您想要的對角線索引值。
  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.]])

的“理論值的對角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])

因此,由於 np.diag_indices() 沒有與 np.triu_indices() 相同的功能來獲取第 k 個對角線/三角形,另一種方法是使用 np.eye(n,k) 構造一個 nxn 矩陣,其中 1在第 k 對角線上,然后使用 np.where 提取 1 所在位置的索引元組。

所以我們可以這樣做:

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

這是眼圖矩陣的額外分配,在某些情況下可能會過多,但它是一個簡單的單行。

還有另一種解決方案。 使用 np.eye 創建矩陣 E。 您可以像下面這樣更改主對角線。 然后,使用 eye 中的 k 參數創建另外兩個矩陣。 最后只需將所有矩陣加在一起。

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)

使用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]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM