2014-11-06 16 views
6

Tôi muốn trả về chỉ số của tất cả các giá trị trong mảng numpy python nằm giữa hai giá trị. Đây là mã của tôi:Cách trả về các chỉ số của các giá trị giữa hai số trong mảng numpy

inEllipseIndFar = np.argwhere(excessPathLen * 2 < ePL < excessPathLen * 3)

Nhưng nó sẽ trả về một lỗi:

inEllipseIndFar = np.argwhere((excessPathLen * 2 < ePL < excessPathLen * 3).all()) 
ValueError: The truth value of an array with more than one element is ambiguous. Use 
a.any() or a.all() 

Tôi muốn biết nếu có một cách để làm điều này mà không cần lặp qua mảng. Cảm ơn!

Trả lời

11

Kể từ > < = trở lại mảng đeo mặt nạ, bạn có thể nhân chúng với nhau để có được hiệu quả bạn đang tìm kiếm (chủ yếu là logic AND):

>>> import numpy as np 
>>> A = 2*np.arange(10) 
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18]) 

>>> idx = (A>2)*(A<8) 
>>> np.where(idx) 
array([2, 3]) 
4

Bạn có thể kết hợp nhiều biểu thức boolean bằng cách sử dụng dấu ngoặc đơn và các hoạt động chính xác :

In [1]: import numpy as np 

In [2]: A = 2*np.arange(10) 

In [3]: np.where((A > 2) & (A < 8)) 
Out[3]: (array([2, 3]),) 

Bạn cũng có thể thiết lập các kết quả của np.where cho một biến để trích xuất các giá trị:

In [4]: idx = np.where((A > 2) & (A < 8)) 

In [5]: A[idx] 
Out[5]: array([4, 6]) 
+2

Ngoài sự tò mò, có sự khác biệt nào giữa phép nhân và kết hợp logic cho các mảng 'Đúng/Sai' không? – Hooked

+1

@Hooked - Không thực sự, nhưng tôi thấy các câu lệnh logic hợp lý dễ đọc hơn – JoshAdel

Các vấn đề liên quan