我有一個矩陣,每一行都有幾個不同的值:
arr1 = np.array([[1,2,3,4,5,6,7,8,9],[10,11,12,13,14,15,16,17,18],[19,20,21,22,23,24,25,26,27]])
arr2 = np.array([["A"],["B"],["C"]])
這將產生以下矩陣:
array([[ 1, 2, 3, 4, 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 15, 16, 17, 18],
[19, 20, 21, 22, 23, 24, 25, 26, 27]])
array([['A'],
['B'],
['C']])
A 代表前 3 列,B 代表接下來的 3 列,C 代表最后 3 列。所以我想要的結果是:
array([[1,2,3],
[13,14,15],
[25,26,27]])
我正在考慮將 arr2 轉換為掩碼陣列,但我什至不確定如何執行此操作。如果它是一個 1darray 我可以做這樣的事情:
arr[0,1,2]
但是對于 2darray,我什至不確定如何像這樣屏蔽。我試過這個并得到錯誤:
arr[[0,1,2],[3,4,5],[6,7,8]]
做到這一點的最佳方法是什么?
謝謝。
uj5u.com熱心網友回復:
您可以string.ascii_uppercase用來索引字母表中的索引。arr1并由 3 個塊重塑:
from string import ascii_uppercase
reshaped = np.reshape(arr1, (len(arr1), -1, 3))
reshaped[np.arange(len(arr1)), np.vectorize(ascii_uppercase.index)(arr2).ravel()]
或者直接映射A到0等等...
reshaped = np.reshape(arr1, (len(arr1), -1, 3))
reshaped[np.arange(len(arr1)), np.vectorize(['A', 'B', 'C'].index)(arr2).ravel()]
兩個輸出:
array([[ 1, 2, 3],
[13, 14, 15],
[25, 26, 27]])
uj5u.com熱心網友回復:
如果你要如上所示固定 arr1 的形狀,(3,9)那么可以使用如下單行代碼完成:
arr2 = np.array([arr1[0][0:3],arr1[1][3:6],arr1[2][6:9]])
輸出如下:
[[ 1 2 3]
[13 14 15]
[25 26 27]]
uj5u.com熱心網友回復:
您可以使用“高級索引”,它通過坐標陣列索引目標陣列。
rows = np.array([[0,0,0],[1,1,1],[2,2,2]])
cols = np.array([[0,1,2],[3,4,5],[6,7,8]])
arr1[rows, cols]
>>> array([[ 1, 2, 3],
[13, 14, 15],
[25, 26, 27]])
你可以做一些功能,比如
def diagonal(arr, step):
rows = np.array([[x]*step for x in range(step)])
cols = np.array([[y for y in range(x, x step)] for x in range(0, step**2, step)])
return arr[rows, cols]
diagonal(arr1, 3)
>>> array([[ 1, 2, 3],
[13, 14, 15],
[25, 26, 27]])
參考:https : //numpy.org/devdocs/user/basics.indexing.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/337993.html
下一篇:需要幫助使這個.txt檔案成為真
