簡體   English   中英

2D Numpy Array花式索引+遮罩

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM