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