2011-12-11 26 views
21

İki numpy dizisi arasında simetrik bir fark gerçekleştirmek için python'da bir set işlemi kullanıyorum. Sonuç, ancak bir set ve ileriye taşımak için onu numpy dizisine dönüştürmem gerekiyor. Bunu yapmanın bir yolu var mı? İşte denedim ne:Bir python kümesini numpy dizisine dönüştürme nasıl yapılır?

a = numpy.array([1,2,3,4,5,6]) 
b = numpy.array([2,3,5]) 
c = set(a)^set(b) 

sonuç kümesidir: Bir numpy diziye dönüştürmek ise

In [27]: c 
Out[27]: set([1, 4, 6]) 

, bu ilk dizi öğesinin tüm set yerleştirir.

array([1,4,6],dtype=int) 

Ben elemanları üzerinde döngü tek tek dönüştürmek için olabilir, ama yerleşik bir işlev için 100.000 öğelere ve ümit olacaktır:

In [28]: numpy.array(c) 
Out[28]: array(set([1, 4, 6]), dtype=object) 

ben gerekenler, ancak bu olurdu döngüyü kaydetmek için. Teşekkürler!

cevap

24

dışlamalı veya gerçekleştirmek için bir dizi numpy dizi dönüştürmeyin (. Yanımda int64) 'dir. Doğrudan setxor1d kullanın.

>>> import numpy 
>>> a = numpy.array([1,2,3,4,5,6]) 
>>> b = numpy.array([2,3,5]) 
>>> numpy.setxor1d(a, b) 
array([1, 4, 6]) 
+0

Karşılaştırma sayısı büyük olduğunda "setxor1d" gibi kötü ayar rutinlerini kullanıyor musunuz? Belki yeni bir soru, ama bence bu cevabı çok ilgili. Benim durumumda, 10m + set işlemleri ile 100k objeye sahip olacağım. – Annan

26

Do:

>>> numpy.array(list(c)) 
array([1, 4, 6]) 

Ve d_type int

+0

Teşekkürler Tito! Şimdi KennyTM'in daha etkili bir cevabı olduğunu gördüm, ama seninki de iyi çalıştı! – mishaF

+4

Bu aslında başlıkta soruya cevap veriyor. –

5

Bunu deneyin.

numpy.array(list(c)) 

nesne olarak birinci eleman yerine tamsayı tek tek öğeleri açardı numpy dizi başlatma önce liste dönüştürme.

İlgili konular