2015-04-30 14 views
5

Tôi có một mảng NumPy như sau:Bắt argsort của mảng NumPy

array([ True, True, True, True, True, False, True, True, False, 
     True, False, True, True, True, True, True, True, False, 
     False, False, False, False, True, True, False, False, False, 
     True, True, True, True, True, True, True, False, True, 
     True, True, True, False, True, True, False, False, True, 
     True, True, False, True, True, True, False], 

Tôi muốn để có được các chỉ số của tất cả các yếu tố True. Không có phương thức get_loc nào giống như Pandas Series và tương tự không có phương thức chỉ mục nào giống như một danh sách. Tôi không muốn chuyển đổi nó thành một danh sách và sau đó sử dụng .index.

Bất kỳ ý tưởng nào?

Trả lời

4

Sử dụng ndarray.nonzero:

>>> a.nonzero() 
(array([ 0, 1, 2, 3, 4, 6, 7, 9, 11, 12, 13, 14, 15, 16, 22, 23, 27, 
     28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 40, 41, 44, 45, 46, 48, 49, 
     50]),) 
0

Để làm điều này trong gấu trúc:

In [255]: 

s[s==True].index 
Out[255]: 
Int64Index([0, 1, 2, 3, 4, 6, 7, 9, 11, 12, 13, 14, 15, 16, 22, 23, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 40, 41, 44, 45, 46, 48, 49, 50], dtype='int64') 

Cập nhật

Trên thực tế bạn có thể sử dụng một thực tế rằng các giá trị là những giá trị đã boolean để che dấu series:

In [256]: 

s[s].index 
Out[256]: 
Int64Index([0, 1, 2, 3, 4, 6, 7, 9, 11, 12, 13, 14, 15, 16, 22, 23, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 40, 41, 44, 45, 46, 48, 49, 50], dtype='int64') 

Tương tự như vậy đối với các mảng NumPy bạn có thể sử dụng các giá trị boolean để che mảng và nhận được các giá trị chỉ số sử dụng np.where:

In [261]: 

np.where(a) 
​ 
Out[261]: 
(array([ 0, 1, 2, 3, 4, 6, 7, 9, 11, 12, 13, 14, 15, 16, 22, 23, 27, 
     28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 40, 41, 44, 45, 46, 48, 49, 
     50], dtype=int64),) 
0

Cách np.ix_ có vẻ là chậm nhất.

In [846]: % timeit a.nonzero() 
1000000 loops, best of 3: 707 ns per loop 

In [845]: % timeit np.where(a) 
1000000 loops, best of 3: 883 ns per loop 

In [849]: %timeit np.ix_(a==True) 
100000 loops, best of 3: 9.21 µs per loop