簡體   English   中英

使用布爾數組在numpy中為2D數組建立索引

[英]using boolean array for indexing in numpy for 2D arrays

我使用布爾索引從numpy數組中選擇元素

x = y[t<tmax]

其中ta numpy數組具有與y一樣多的元素。 我的問題是如何對2D numpy數組執行相同操作? 我試過了

x = y[t<tmax][t<tmax]

但是,這似乎不起作用,因為它似乎先選擇了行,然后抱怨第二個選擇的維數錯誤。

IndexError: boolean index did not match indexed array along dimension 0; dimension is 50 but corresponding boolean dimension is 200

這是一個例子

print(x2D[x1D<3])

第二個打印語句產生的錯誤類似於上面顯示的錯誤。 我用

[[1 2 3]
 [1 2 3]]

我懂了

[[1 2]
 [1 2]]

但我想要

 [[1 2] [1 2]] 
In [28]: x1D = np.array([1,2,3], np.int32) 
    ...: x2D = np.array([[1,2,3],[1,2,3],[1,2,3]], np.int32) 

一維蒙版:

In [29]: x1D<3                                                                                               
Out[29]: array([ True,  True, False])

應用於一維數組(大小相同):

In [30]: x1D[_]                                                                                              
Out[30]: array([1, 2], dtype=int32)

應用於2d,它選擇2行:

In [31]: x2D[_29]                                                                                            
Out[31]: 
array([[1, 2, 3],
       [1, 2, 3]], dtype=int32)

可以再次使用它來選擇列-但請注意:行索引的:占位符:

In [32]: _[:, _29]                                                                                           
Out[32]: 
array([[1, 2],
       [1, 2]], dtype=int32)

如果我們從該掩碼生成索引數組,則可以一步完成索引操作:

In [37]: idx = np.nonzero(x1D<3)                                                                             
In [38]: idx                                                                                                 
Out[38]: (array([0, 1]),)
In [39]: x2D[idx[0][:,None], idx[0]]                                                                         
Out[39]: 
array([[1, 2],
       [1, 2]], dtype=int32)

編寫此“ 2d”索引的另一種方法:

In [41]: x2D[ [[0],[1]], [[0,1]] ]                                                                           
Out[41]: 
array([[1, 2],
       [1, 2]], dtype=int32)

ix_是用於調整索引尺寸的便捷工具:

In [42]: x2D[np.ix_(idx[0], idx[0])]                                                                         
Out[42]: 
array([[1, 2],
       [1, 2]], dtype=int32)

或將布爾型掩碼傳遞給ix_

In [44]: np.ix_(_29, _29)                                                                                    
Out[44]: 
(array([[0],
        [1]]), array([[0, 1]]))
In [45]: x2D[np.ix_(_29, _29)]                                                                               
Out[45]: 
array([[1, 2],
       [1, 2]], dtype=int32)

In[32]所以很接近您的嘗試:

In [46]: x2D[x1D<3][:, x1D<3]                                                                                
Out[46]: 
array([[1, 2],
       [1, 2]], dtype=int32)

暫無
暫無

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

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