2017-05-31 5 views
0

Ich habe ein numpy Array namens a, ich möchte überprüfen, ob es ein Element in einem Bereich enthält, der durch zwei Werte angegeben wird.Wie kann man effizient überprüfen, ob ein numpy Array ein Objekt innerhalb des angegebenen Bereichs enthält?

import numpy as np 
a = np.arange(100) 

mintrshold=33 
maxtreshold=66 

Meine Lösung:

goodItems = np.zeros_like(a) 
goodItems[(a<maxtreshold) & (a>mintrshold)] = 1 

if goodItems.any(): 
    print (there s an item within range) 

Können Sie mir eine effektivere, pythonic Art und Weise?

+0

Ich weiß nicht, über numpy per se , aber mit normaler Python-Liste würde ich es so schreiben; falls vorhanden (mintrshold EzzatA

Antwort

2

Numpy-Arrays funktioniert nicht gut mit Pythonic a < x < b. Aber es gibt func dafür:

np.logical_and(a > mintrshold, a < maxtreshold) 

oder

np.logical_and(a > mintrshold, a < maxtreshold).any() 

in Ihrem speziellen Fall. Grundsätzlich sollten Sie zwei elementare Ops kombinieren. Suchen Sie nach logic funcs um weitere Informationen zu

+0

Danke, es ist eleganter und 2,5 mal schneller als meine naive Lösung. – user3598726

1

auf die reine Numpy Antwort Hinzufügen wir auch itertools

import itertools 

bool(list(itertools.ifilter(lambda x: 33 <= x <= 66, a))) 

Für kleinere Arrays dies würde genügen können:

bool(filter(lambda x: 33 <= x <= 66, a)) 
+0

Ich habe versucht, Ihre zweite Zeile, aber es funktioniert nicht, immer am Ende wird True – user3598726

+0

Ich dachte, das war die gewünschte Ausgabe, um 'True' zurückzugeben, wenn die Zahlen im Array in den Zustand fallen. Wenn Sie eine Liste/ein Array von Bools benötigen, lassen Sie es mich wissen und ich kann es für Sie ändern. –

+0

Sie haben meine Frage gut interpretiert, aber wenn a = np.arange (100,120), gibt Ihre zweite Zeile immer noch True zurück – user3598726

Verwandte Themen