2012-05-12 24 views
9

: Ben ab içinde tüm unsurları içeriyorsa bilmek istiyorumNumpy: Dizi belirli sayılar içerip içermediğini nasıl kontrol edilir? Örneğin

a = np.array([123, 412, 444]) ve b = np.array([123, 321]) var. Bunun için basit bir operasyon var mı? Bu durumda bu doğru olmaz.

+0

Benzersiz elemanları mı kastediyorsunuz? a = [3,3,4], b = [3,4,5], b içinde yer alan tüm elemanlar nelerdir? – Akavall

+0

Hayır b'deki tüm öğelerin birde olması gerektiği anlamına geliyordu. Aradığım şeyi aşağıda bulduğum yerler. Teşekkürler – luffe

cevap

10

Aradığınızı belirlemek için set farkını kullanabilirsiniz. Numpy yerleşik bir işlev numpy.setdiff1d(ar1, ar2) çağırdı:

Return the sorted, unique values in ar1 that are not in ar2.

Örnek dava için: dava için Yani

>>> a = np.array([123, 412, 444]) 
>>> b = np.array([123, 321]) 
>>> diff = np.setdiff1d(b, a) 
>>> print diff 
array([321]) 
>>> if diff.size: 
>>> print "Not passed" 

, size b bir çıkarma olacak bir dizi fark yapmak ve bir dizi elde ediyorum b içinde olmayan öğelere sahip. O zaman boş olup olmadığını kontrol edebilirsiniz. Görebildiğiniz gibi,no.lu adreste bulunan ancak b'da olmayan bir girdi olan çıktı 312; Artık uzunluğu sıfırdan büyüktür, bu nedenle a'da bulunmayan b numaralı elemanlar vardı.

+0

Herkese teşekkürler – luffe

+0

@luffe Sorunuzu cevapladıysam lütfen cevap olarak işaretleyin. – petr

+0

@petr 'diff' yerine – jamylak

-1

bunu yapabilirsiniz: Eğer b her öğe bir içerdiği olup olmadığını kontrol etmek istediğiniz anlamına gelir

a = an_array 
b = another_array 
for i in b: 
    if i not in a: 
     return False 
return True 
+0

Bu geçerli bir Python değil. Ayrıca, numpy dizisindeki bir Python döngüsü çok yavaştır. – rubik

+0

Bu geçersiz python tam olarak nasıl? – cobie

+1

Açıkçası, bunu tercümanda çalıştırmamışsınızdır. Eğer yapmış olsaydınız, kodunuzun bir 'SyntaxError: 'return' dışında 'fonksiyonunu' ortaya çıkardığını keşfettiniz. – rubik

2

.

from numpy import array, in1d 
a = array([123, 412, 444]) 
b = array([123, 321]) 
print in1d(b, a).all() 
12

Sen Alway kümesi kullanabilirsiniz: in1d bunu yapmaz

>>> a = numpy.array([123, 412, 444]) 
>>> b = numpy.array([123, 321]) 
>>> set(b) in set(a) 
False 

Veya Numpy daha yeni sürümleri ile

:

>>> numpy.in1d(b,a) 
array([ True, False], dtype=bool) 

sadece 'cevabını' yerine istiyorsanız Bir dizi:

>>> numpy.in1d(b,a).all() 
False 

Ya (en arzu):

>>> numpy.array([x in a for x in b]) 
array([ True, False], dtype=bool) 

Döngü numpy diziler üzerinde slowish ve kaçınılmalıdır.

+0

'set (b) set (a) 'muhtemelen ne istediğinizi yapmaz, bu set.is [super | sub] set' olur. – TryPyPy

+0

Neden (b) setindeki (a) çalışmaz? – Arturo

İlgili konular