我有一個np.array:
a = np.array([x for x in range(10) for y in range(10)]).reshape(10, 10)
我想得到3rd和6th行列4,7,10- 標記為綠色。

我試過了:
a[[2,5]] # gives me the rows I want
a[[2,5], [3,6,10]] # produces an an error
IndexError:形狀不匹配:索引陣列無法與形狀(2,)(3,)一起廣播
最后的結果應該是這樣的:
[[2,2,2],
[5,5,5]]
我的錯誤在哪里?
uj5u.com熱心網友回復:
第一個索引串列必須是 (2,1) 形狀(或等效串列):
In [31]: a[[[2], [5]], [3, 6, 9]]
Out[31]:
array([[2, 2, 2],
[5, 5, 5]])
您了解錯誤訊息的含義broadcasting嗎?
對于簡單的加法,(2,1) 陣列與 (3,) 一起廣播以產生 (2,3) 結果:
In [32]: I, J = np.array((2, 5)), np.array((3, 6, 9))
In [33]: I, J
Out[33]: (array([2, 5]), array([3, 6, 9]))
In [34]: I J
Traceback (most recent call last):
Input In [34] in <module>
I J
ValueError: operands could not be broadcast together with shapes (2,) (3,)
In [35]: I[:, None] J
Out[35]:
array([[ 5, 8, 11],
[ 8, 11, 14]])
相同的想法適用于使用多個陣列進行索引。
您a可以使用相同的邏輯創建:
In [38]: np.arange(10)[:, None] np.zeros(10,int)
Out[38]:
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
[3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
[4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5],
[6, 6, 6, 6, 6, 6, 6, 6, 6, 6],
[7, 7, 7, 7, 7, 7, 7, 7, 7, 7],
[8, 8, 8, 8, 8, 8, 8, 8, 8, 8],
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]])
使用匹配大小的 2 個陣列(串列),效果是選擇一個“對角線”或 1d 值陣列(而不是您嘗試獲取的塊):
In [39]: a[[2, 3], [5, 6]]
Out[39]: array([2, 3])
In [40]: a[2, 5], a[3, 6]
Out[40]: (2, 3)
uj5u.com熱心網友回復:
我相信這個鏈接將解釋一切,因為問題是相同的并且得到了很好的答案: Selecting specific rows and columns from NumPy array
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/433831.html
