[英]2D Numpy Array Fancy Indexing + Masking
我有:
import numpy as np
a = np.array([[ 4, 99, 2],
[ 3, 4, 99],
[ 1, 8, 7],
[ 8, 6, 8]])
為什么是
a[[True, True, False, False], [1,2]]
等於
array([99, 99])
並不是
array([99, 2],
[4, 99])
因為我使用布爾掩碼選擇前兩行,而使用花式索引選擇第二和第三列? 特別是因為打電話
a[[True, True, False, False],:][:, [1,2]]
給了我我期望的結果。 我猜想這是某種廣播規則,但對我來說並不明顯。 謝謝!
的布爾值數組或列表的計算結果,就好像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]
。
用相互廣播的數組(或等效列表)索引該塊,以產生一個(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
我認為它的工作方式如下:
In [284]: a
Out[284]:
array([[ 4, 99, 2],
[ 3, 4, 99],
[ 1, 8, 7],
[ 8, 6, 8]])
In [286]: bo
Out[286]: array([ True, True, False, False], dtype=bool)
In [287]: boc
Out[287]: array([1, 2])
現在,一旦我們使用布爾掩碼bo
索引a
,我們將得到:
In [285]: a[bo]
Out[285]:
array([[ 4, 99, 2],
[ 3, 4, 99]])
因為, bo
計算結果為[1, 1, 0, 0]
這將只需要選擇的前兩行a
。
現在,我們將boc
ie [1, 2]
與選擇掩碼bo
的行結合使用。
In [288]: a[bo, boc]
Out[288]: array([99, 99])
在此,將掩碼boc
應用於已獲取的行 。 然后從第一行選擇第二個元素,從第二行選擇第三個元素,產生[99, 99]
。
但是,有趣的是,如果您執行以下操作:
In [289]: a[1, [1, 2]]
Out[289]: array([ 4, 99])
在這種情況下,numpy廣播產生索引[(1,1), (1,2)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.