簡體   English   中英

布爾屏蔽的花式索引| Python中的Numpy

[英]Fancy Indexing with Boolean Masking | Numpy in Python

我在《 Python數據科學手冊》中遇到了這段代碼,出於可讀性考慮在此處進行了修改。 對於我來說,這很令人困惑,因為它結合了花式索引和遮罩,而且我無法理解其下發生了什么。

import numpy as np
X = np.arange(12).reshape(3,4)
print("---X----\n",X)
row = np.array([0,1,2])
mask = np.array([1, 0, 1, 0], dtype=bool)
print("\n-----row vector after reshaping ----\n",row[:, np.newaxis])
print("\n ---mask  ----\n",mask)
print("\n ----result-----\n",X[row[:, np.newaxis], mask])

這是輸出:

---X----
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

-----row vector after reshaping ----
 [[0]
 [1]
 [2]]

 ---mask  ----
 [ True False  True False]

 ----result-----
 [[ 0  2]
 [ 4  6]
 [ 8 10]]

我的理解是

X[row[:,np.newaxis],[1,2,3]]

廣播開始,因為第一個參數的形狀為(3,1),第二個參數的形狀為(3,)。 它廣播兩個參數到(3,3),然后花式索引選擇相應的定位元素,結果大小就是參數的大小(這是花式索引文檔所說的)。

但是我之前發布的代碼使我感到困惑。 根據我的推斷,第二個參數(掩碼)等於shape(4,)的[1,0,1,0],第一個參數為

[[0],
[1],
[2]
]

形狀(3,1)。 在這種情況下,這兩個參數都應廣播到(3,4),然后將元素拾取,得到大小為-(3,4)的結果矩陣。 是的,我知道它違背了布爾蒙版概念的目的,但是我們並沒有像X [mask]這樣做,因為我們在mask為True的情況下獲得了各自的值。 在我們的X[row[:, np.newaxis], mask])語句中,第一個參數是整數數組,第二個參數是布爾數組。 布爾數組不是轉換為整數以與第一個參數一起播放,還是布爾數組首先對列進行選擇,結果是:

[[0 2],
[4,6],
8,10]
]

在此我們應用第一個參數。

您處在正確的軌道上,布爾值確實已轉換為(或至少可以視為轉換為)索引。 也許是這種轉換的細節使您感到困惑?

這是文檔中的相關內容

通常,如果索引包含布爾數組,則結果將與將obj.nonzero()插入相同位置並使用上述整數數組索引機制相同。 x [ind_1,boolean_array,ind_2]等效於x [(ind_1,)+ boolean_array.nonzero()+(ind_2,)]。

現在,簡單地將其應用於您的示例:

mask.nonzero()
# (array([0, 2]),)

所以,

(row[:, None],) + mask.nonzero()
# (array([[0],
#         [1],
#         [2]]), array([0, 2]))

是有效指標。 廣播到3x2 ,一切都如預期。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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