獲取值為 1 的右上三角形的索引的最有效方法是什么?
鑒于:
A = np.array([
[0,1,0,1],
[1,0,1,0],
[0,1,0,0],
[1,0,0,0]])
我想要:
[(0,1), (0,3), (1,2)]
np.where(A[np.triu_indices(A.shape[0])]==1)給我它作為一維陣列而不是元組。看著使用np.unravel_index(mask,(4,4)),但給了:
(array([[0, 0, 1]], dtype=int64), array([[1, 3, 1]], dtype=int64))
哪個不正確,因為最后一個元組應該是 1,2?
uj5u.com熱心網友回復:
您可以使用np.triu來制作掩碼,np.where獲取索引,并使用zip list將它們轉換為正確的格式:
indexes = list(zip(*np.where(np.triu(A))))
輸出:
>>> indexes
[(0, 1), (0, 3), (1, 2)]
uj5u.com熱心網友回復:
In [77]: A = np.array([[0, 1, 0, 1], [1, 0, 1, 0], [0, 1, 0, 0], [1, 0, 0, 0]])
上三:
In [78]: np.triu(A)
Out[78]:
array([[0, 1, 0, 1],
[0, 0, 1, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]])
非零索引 - 作為可用于索引的陣列元組A:
In [79]: np.nonzero(np.triu(A))
Out[79]: (array([0, 0, 1]), array([1, 3, 2]))
它的轉置給出了索引對的陣列。它更接近你想要的,雖然不方便索引:
In [80]: np.argwhere(np.triu(A))
Out[80]:
array([[0, 1],
[0, 3],
[1, 2]])
元組與對的索引:
In [84]: A[np.nonzero(np.triu(A))]
Out[84]: array([1, 1, 1])
In [85]: [A[tuple(pair)] for pair in np.argwhere(np.triu(A))]
Out[85]: [1, 1, 1]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/430704.html
