假設我有一個對稱的 n×n 陣列A和一個長度為 n 的一維陣列x,其中的行/列A對應于 的條目x,并且x是有序的。現在假設兩者A和x都是隨機重新排列的,因此行/列仍然對應,但它們不再按順序排列。我該如何操作A以恢復正確的順序?
例如:x = array([1, 3, 2, 0])和
A = array([[1, 3, 2, 0],
[3, 9, 6, 0],
[2, 6, 4, 0],
[0, 0, 0, 0]])
所以這個例子中從x到的映射是。應該排序,我想到達AA[i][j] = x[i]*x[j]xarray([0, 1, 2, 3])
A = array([[0, 0, 0, 0],
[0, 1, 2, 3],
[0, 2, 4, 6],
[0, 3, 6, 9]])
uj5u.com熱心網友回復:
我猜 OP 正在尋找一種靈活的方式來使用索引,它可以同時對映射的行和列進行排序。更重要的是,OP 可能有興趣反向執行,即如果丟失,則查找和初始映射視圖。
def mapping(x, my_map, return_index=True, return_inverse=True):
idx = np.argsort(x)
out = my_map(x[idx], x[idx])
inv = np.empty_like(idx)
inv[idx] = np.arange(len(idx))
return out, idx, inv
x = np.array([1, 3, 2, 0])
a, idx, inv = mapping(x, np.multiply.outer) #sorted mapping
b = np.multiply.outer(x, x) #straight mapping
print(b)
>>> [[1 3 2 0]
[3 9 6 0]
[2 6 4 0]
[0 0 0 0]]
print(a)
>>> [[0 0 0 0]
[0 1 2 3]
[0 2 4 6]
[0 3 6 9]]
np.array_equal(b, a[np.ix_(inv, inv)]) #sorted to straight
>>> True
np.array_equal(a, b[np.ix_(idx, idx)]) #straight to sorted
>>> True
uj5u.com熱心網友回復:
一個簡單的實作是
idx = np.argsort(x)
A = A[idx, :]
A = A[:, idx]
另一種可能性是(全部歸功于@mathfux):
A[np.ix_(idx, idx)]
uj5u.com熱心網友回復:
您可以使用argsort和花哨的索引:
idx = np.argsort(x)
A2 = A[idx[None], idx[:,None]]
輸出:
array([[0, 0, 0, 0],
[0, 1, 2, 3],
[0, 2, 4, 6],
[0, 3, 6, 9]])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/424155.html
