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