矩陣[True,False]在numpy中做什么?

例如,我有matrix=np.array([[1,2],[3,4]])

當我在Numpy中使用布爾過濾時,比如:matrix[[True,False]],我理解它是如何工作的——我會得到第一行。但是當我使用類似于:matrix[True, False]的東西時,我得到的是空括號。我想,在這種情況下,布爾值意味著我想使用哪個維度,因為如果我寫:matrix[True, True],那么我會得到整個矩陣,但如果我使用:matrix[True, True, False],那么即使我有一個二維數組,我也會得到空括號。

這實際上是如何工作的?

? 最佳回答:

這是一個非常奇怪的案例。事實上,它已經過測試,但我不認為這種行為在任何地方都有記錄。

如果你用任何數字True scalars對數組進行索引,結果相當于arr[np.newaxis]:它包含了原始數組的所有數據,但額外增加了一個length- 1軸位于其形狀的起點。

如果你用任意數量的布爾值scalars對數組進行索引,其中至少有一個是False,你會得到一個空結果。結果具有原始數組的形狀,但有一個額外的length- 0軸位于形狀的開始處。


布爾索引的正常情況是索引數組和原始數組具有相同的形狀。在正常情況下,所需的行為是生成一個1D數組,其中包含與索引數組中的True個單元格對應的原始數組的所有元素。

對于>=1D布爾索引arrays,這相當于用index.nonzero()代替索引數組。但是nonzero()對于0D arrays來說有點奇怪。相反,0D布爾arraylikes(包括普通布爾scalars)具有特殊處理。

代碼中的注釋描述了特殊處理,如下所示:

                /*
                 * This can actually be well defined. A new axis is added,
                 * but at the same time no axis is "used". So if we have True,
                 * we add a new axis (a bit like with np.newaxis). If it is
                 * False, we add a new axis, but this axis has 0 entries.
                 */

當你用一個布爾值scalar索引對數組進行索引時,注釋準確地描述了行為。特別是,它在激勵特殊處理的情況下做了正確的事情:array(5.0)[True]產生array([5.0])array(5.0)[False]產生scalars。

但對于兩個scalar布爾索引,其行為與注釋并不完全一致。閱讀注釋時,您會期望每個注釋都向輸出中添加一個新軸,因此,如果數組arr的形狀為(x, y),您會希望arr[True, False]得到形狀為scalars的(空)輸出。但事實并非如此。發生的事情就是我在答案的第一部分所描述的。

這是因為該實現沒有為0D布爾索引添加多個軸的處理。它可以對np.newaxis執行此操作,但對0D布爾索引沒有處理。相反,它設置了一個變量來添加至少一個“花哨的索引”維度:

                if (fancy_ndim < 1) {
                    fancy_ndim = 1;
                }

然后,對于每個布爾值scalar索引,它將最后一個“花式索引”維度的長度乘以1(對于True),或乘以0(對于False):

        else if (indices[i].type == HAS_0D_BOOL) {
            mit->fancy_strides[j] = 0;
            mit->fancy_dims[j] = 1;
            /* Does not exist */
            mit->iteraxes[j++] = -1;
            if ((indices[i].value == 0) &&
                    (mit->dimensions[mit->nd_fancy - 1]) > 1) {
                goto broadcast_error;
            }
            mit->dimensions[mit->nd_fancy-1] *= indices[i].value;
        }

這種處理的動機是與廣播的類比——就好像我們在廣播形狀為(1,)(0,)的arrays的花哨索引維度。事實上,代碼實際上創建了那些shape-(1,)或shape-(0,) arrays,盡管我認為它對它們的內容沒有任何作用——這些值不用于索引。如果發生廣播失敗,這些arrays用于錯誤消息,我認為它們在以后創建內部迭代器時被用作虛擬對象。


這種處理也意味著,如果你將布爾值scalars與其他形式的“花哨索引”(如整數arrays)結合使用,你會看到其他奇怪的行為。例如,如果我們有以下arrays:

arr = np.array([10, 11, 12, 13])
index = np.array([[1, 2],
                  [0, 3]])

那么arr[index]將產生一個2-by- 2其元素為arr[1]arr[2]、{@160}和arr[3]的數組。

但如果我們這樣做arr[index, True]arr[index, False]

In [31]: arr[index, True].shape
Out[31]: (2, 2)

In [32]: arr[index, False].shape
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Input In [32], in <cell line: 1>()
----> 1 arr[index, False].shape

IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (2,2) (0,) 

arr[index, True]的形狀與arr[index]相同,而arr[index, False]會導致廣播失敗。

主站蜘蛛池模板: 亚洲AV无码一区二区一二区| 亚洲中文字幕丝袜制服一区| 在线精品日韩一区二区三区| 亚洲AV无一区二区三区久久| 国产AV国片精品一区二区| 国产精品福利一区二区| 亚洲一区二区三区夜色| 国产精品一区二区不卡| 另类一区二区三区| 亚洲国产av一区二区三区丶| 伊人久久精品无码麻豆一区| 日韩精品无码免费一区二区三区| 肉色超薄丝袜脚交一区二区| 熟女少妇丰满一区二区| 水蜜桃av无码一区二区| 国精产品一区二区三区糖心| 一区二区三区精品视频| 国产综合无码一区二区辣椒| 久久无码精品一区二区三区| 无码AV中文一区二区三区| 免费看一区二区三区四区| 中文字幕在线一区| 夜夜添无码试看一区二区三区 | 精品亚洲A∨无码一区二区三区 | 无码人妻精品一区二区三区夜夜嗨| 乱中年女人伦av一区二区| 国产一区美女视频| 国产亚洲无线码一区二区| 成人精品一区二区三区不卡免费看| 内射女校花一区二区三区| av无码人妻一区二区三区牛牛| 人妻少妇AV无码一区二区| 久久福利一区二区| 国内精品一区二区三区东京| 一区二区三区免费看| 中文字幕久久亚洲一区| 亚洲狠狠久久综合一区77777| 中文字幕一区视频| 精品一区二区91| 日韩人妻无码一区二区三区久久| 人妻久久久一区二区三区|