布爾矩陣或列表計算,就好像where
有它轉換爲索引陣列:
In [285]: a[[True,True,False,False],[1,2]]
Out[285]: array([99, 99])
In [286]: a[np.where([True,True,False,False]),[1,2]]
Out[286]: array([[99, 99]])
In [287]: np.where([True,True,False,False])
Out[287]: (array([0, 1], dtype=int32),)
In [288]: a[[0,1], [1,2]]
Out[288]: array([99, 99])
所以這是採摘a[0,1]
和a[1,2]
,一個 '配對' 塞萊ction。
該塊索引與陣列(或列表當量)彼此抵靠的是廣播,以產生(2,2)陣列:
In [289]: a[np.ix_([0,1], [1,2])]
Out[289]:
array([[99, 2],
[ 4, 99]])
In [290]: a[[[0],[1]], [1,2]]
Out[290]:
array([[99, 2],
[ 4, 99]])
這種情況相當於一個2級索引:a[[0,1],:][:,[1,2]]
我正在使用np版本12.布爾指數在最近的版本中發生了一些變化。例如,如果布爾的長度不正確,它會運行,但會發出警告(這部分是新的)。
In [349]: a[[True,True,False],[1,2]]
/usr/local/bin/ipython3:1: VisibleDeprecationWarning: boolean index did not match indexed array along dimension 0; dimension is 4 but corresponding boolean dimension is 3
#!/usr/bin/python3
Out[349]: array([99, 99])
爲13節的變化中描述:
https://docs.scipy.org/doc/numpy-dev/release.html#boolean-indexing-changes
我得到一個'IndexError:形狀不匹配:索引陣列不能與形狀(4)一起廣播(2,)'對於您的查詢... –
這只是下標索引,從每個dim的每個索引中選取一組索引中的每個元素。所以,它的索引用'(0,1)'[0從布爾數組的第一個TRUE elem,1從int索引數組的第一個元素]爲第一個elem和'(1,2)'爲第二個。 – Divakar
@WillemVanOnsem我認爲OP意味着使用布爾**陣列**不只是一個普通的Python列表索引。如果你將它們轉換爲數組,那麼你會得到OP的結果。 – kmario23