假設我有一個二維 numpy 陣列,
A = [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]] # Shape: (3, 4)
我還有另一個一維陣列,
B = [0, 2, 1] # Shape: (3,)
我想從對應于 B 的第 i 個元素的 A 的第 i 行的索引中提取一個元素。意思是,如果我們考慮 B 中的第 3 個元素,則輸出將是 A 的第 3 行的第 1 個元素(即 8)。
因此,所需的輸出是:
C = [0, 6, 8]
現在,這可以很容易地使用 a 來完成for loop,但是,我正在尋找其他一些優化的方法來做到這一點。
我試過np.take()了,但它沒有按預期作業。
uj5u.com熱心網友回復:
使用高級索引足夠簡單
C = A[np.arange(B.size), B]
[0, 6, 9]正如@MichaelDelgado 指出的那樣,對于您的示例,產生的結果是正確的。
uj5u.com熱心網友回復:
答案:將串列理解與 Enumerate 結合使用
您可以列出理解,enumerate它會為您提供語法中的 touples 串列(index, value)。因此,例如,enumerate([0,2])將導致[(0,0), (1,2)].
因此,為了做到這一點,它將是
In: C = [A[point[0]][point[1]] for point in enumerate(B)]
Out: [0,6,9]
這將是您正在尋找的答案。我相信您在假設答案中的 8 是不正確的。
uj5u.com熱心網友回復:
如果您的 B 陣列是您想要為第一個軸中的每個元素提供的沿第二個軸的位置,只需在第一個維度中提供一組相應的索引:
In [4]: A[range(A.shape[0]), B]
Out[4]: array([0, 6, 9])
這相當于:
In [5]: A[[0, 1, 2], [1, 2, 0]]
Out[5]: array([0, 6, 9])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/524419.html
下一篇:ValueError:multilabel-indicatorformatisnotsupported,由于錯誤無法制作ROC曲線
