簡體   English   中英

帶有Numpy數組,元組和省略號的布爾索引

[英]Boolean indexing with Numpy Array, tuples and Ellipsis

我了解帶有整數的Numpy數組布爾索引概念

In [95]: a=np.array([1, 2, 3, 2, 1, 2])

In [96]: a==1
Out[96]: array([ True, False, False, False,  True, False], dtype=bool

In [97]: a[a==1]
Out[97]: array([1, 1])

但是我不明白比較如何與Numpy Array和元組一起工作,為什么?

In [106]: a = np.array([(2011, 3), (2011, 3), (2011, 3), ..., (2015, 6), (2015, 6),
   (2015, 6), (2011, 3), (2011, 3)], dtype=object)

(...)是省略號

回報

In [107]: a==(2011,3)
Out[107]: False

我期待一個像

array([ True,  True,  True, False, False, False, False,  True,  True], dtype=bool)

如何比較帶有元組的Numpy數組和元組以獲得布爾數組?

使用熊貓,這非常簡單

In [113]: pd.Series(a)==(2011, 3)
Out[113]:
0     True
1     True
2     True
3    False
4    False
5    False
6    False
7     True
8     True
dtype: bool

但是我正在尋找一個純粹的Numpy解決方案。

您可以使用列表理解:

a = np.array([(2011, 3), (2011, 3), (2011, 3), (2015, 6), (2015, 6), (2015, 6), (2011, 3), (2011, 3)], dtype=object)

>>> [(x, y) == (2011, 3) for x, y in a]
[True, True, True, False, False, False, True, True]

問題是a是dtype object 沒有為這種類型的數組定義許多普通的數組操作,並且通常將其恢復為將數組視為列表。

In [382]: a==(2011,3)
Out[382]: False
In [383]: a.tolist()==(2011,3)
Out[383]: False

正如@Alexander指出的那樣,您可以使用列表推導執行逐個元素的比較。 此版本甚至可以與Ellipsis

In [399]: [i==(2011,3) for i in a]
Out[399]: [True, True, True, False, False, False, False, True, True]

Ellipsis不產生標量布爾值。 我可以用一個元組替換它,並且仍然得到標量。

In [384]: a1=a.copy()
In [385]: a1[3]=(0,0)
...
In [387]: a1==(2011,3)
Out[387]: False

乍一看, Ellipsis看起來像印刷品。 但是,事實pd.Series(a)==(2011, 3)正好產生9個值表明,它可能不是-除非它只是cooincidence是pd格式替代Ellipsis只有一個元素。

Ellispsis可能是a是對象Ellispsis的原因。

In [389]: np.array([(2011, 3), (2011, 3), (2011, 3), Ellipsis, (2015, 6), (2015, 6),(2015, 6), (2011, 3), (2011, 3)])
Out[389]: 
array([(2011, 3), (2011, 3), (2011, 3), Ellipsis, (2015, 6), (2015, 6),
       (2015, 6), (2011, 3), (2011, 3)], dtype=object)

沒有它, np.array會產生一個二維數組:

In [390]: np.array([(2011, 3), (2011, 3), (2011, 3), (2015, 6), (2015, 6),(2015, 6), (2011, 3), (2011, 3)])
Out[390]: 
array([[2011,    3],
       [2011,    3],
       [2011,    3],
       [2015,    6],
       [2015,    6],
       [2015,    6],
       [2011,    3],
       [2011,    3]])

可以將沒有省略號的a1轉換為2d:

In [396]: a1.astype('i,i').view(int).reshape(-1,2)
Out[396]: 
array([[2011,    3],
       [2011,    3],
       [2011,    3],
       [   0,    0],
       [2015,    6],
       [2015,    6],
       [2015,    6],
       [2011,    3],
       [2011,    3]])

可以使用(...).all(axis=1)測試2d

暫無
暫無

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

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