2011-12-11 9 views
21

मैं दो numpy arrays के बीच एक सममित अंतर करने के लिए पायथन में एक सेट ऑपरेशन का उपयोग कर रहा हूँ। नतीजा, हालांकि, एक सेट है और मुझे आगे बढ़ने के लिए इसे वापस एक numpy सरणी में बदलने की जरूरत है। क्या इसे करने का कोई तरीका है? यहाँ मैं क्या करने की कोशिश की है:एक पायथन सेट को एक numpy सरणी में कैसे परिवर्तित करें?

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

परिणाम एक सेट है:

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

अगर मैं एक numpy सरणी में बदलने का, यह पहली सरणी तत्व में पूरे सेट देता है।

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

मैं क्या जरूरत है, हालांकि, इस होगा:

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

मैं तत्वों से अधिक पाश एक के बाद एक कन्वर्ट करने के लिए कर सकता है, लेकिन मैं 100,000 तत्वों है और एक में निर्मित समारोह के लिए आशा व्यक्त की होगी लूप को बचाने के लिए। धन्यवाद!

उत्तर

24

एक सेट के लिए numpy सरणी परिवर्तित अनन्य या प्रदर्शन करने के लिए न करें। सीधे setxor1d का उपयोग करें।

>>> 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

'setxor1d' जैसे numpy set routines का उपयोग कर रहा है, जब तुलना की संख्या बड़ी है? शायद एक नया सवाल है, लेकिन मुझे लगता है कि इस जवाब से बहुत संबंधित है। मेरे मामले में मेरे पास 10 मीटर + सेट ऑपरेशंस के साथ 100k ऑब्जेक्ट्स होंगे। – Annan

26

है:

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

और dtype पूर्णांक (। मेरी तरफ int64) है

+0

धन्यवाद Tito! अब मैं देखता हूं कि केनीटीएम का एक और अधिक कुशल जवाब था, लेकिन आपका भी ठीक काम करता था! – mishaF

+4

यह वास्तव में शीर्षक में प्रश्न का उत्तर देता है। –

5

इसे आजमाएं।

numpy.array(list(c)) 

numpy सरणी आरंभ वस्तु के रूप में पहला तत्व के बजाय पूर्णांक अलग-अलग तत्वों स्थापित करेगा से पहले सूचीबद्ध करने के लिए परिवर्तित।

संबंधित मुद्दे