2016-12-18 11 views
6

के सभी क्रमपरिवर्तन प्राप्त करें मेरे पास एक numpy array [0, 1, 1, 2, 2, 0, 1, ...] है जिसमें केवल 0-के संख्याएं हैं। मैं एक नई सरणी बनाना चाहता हूं जिसमें 0-के के क्रमिक क्रमों के एन संभावित सरणी शामिल हों। के = 2 और एन = 6:एक numpy array

a = [0, 1, 0, 2] 
permute(a) 
result = [[0, 1, 0, 2] 
      [0, 2, 0, 1] 
      [1, 0, 1, 2] 
      [2, 1, 2, 0] 
      [1, 2, 1, 0] 
      [2, 0, 2, 1]] 

क्या किसी के पास कोई विचार/समाधान है कि कोई इसे कैसे प्राप्त कर सकता है?

+2

यह डुप्लिकेट है के साथ साथ एक [दूर गूगल] (http://stackoverflow.com/questions/27323448/numpy-array-to-permutation-matrix)। – kabanus

+3

@ कबाणस ओपी * अलग-अलग * क्रमपरिवर्तन चाहता है - जो कि लिंक नहीं देता है। –

उत्तर

11

आपका एक क्या combinatorists एक मल्टीसेट कहते हैं। sympy पुस्तकालय में उनके साथ काम करने के लिए विभिन्न दिनचर्या हैं।

>>> from sympy.utilities.iterables import multiset_permutations 
>>> import numpy as np 
>>> a = np.array([0, 1, 0, 2]) 
>>> for p in multiset_permutations(a): 
...  p 
...  
[0, 0, 1, 2] 
[0, 0, 2, 1] 
[0, 1, 0, 2] 
[0, 1, 2, 0] 
[0, 2, 0, 1] 
[0, 2, 1, 0] 
[1, 0, 0, 2] 
[1, 0, 2, 0] 
[1, 2, 0, 0] 
[2, 0, 0, 1] 
[2, 0, 1, 0] 
[2, 1, 0, 0] 
+0

इस बारे में नहीं पता था। कुछ नया सीखा! धन्यवाद! +1 –

+0

यहां मेरी उपस्थिति का एक बड़ा कारण भी है! –

4

अगर आपके क्रमपरिवर्तन स्मृति में फिट, आप उन्हें एक set में संग्रहीत कर सकती है और इस तरह केवल अलग पहचाना क्रमपरिवर्तन मिलता है।

from itertools import permutations 

a = [0, 1, 0, 2] 

perms = set() 
for perm in permutations(a): 
    perms.add(perm) 

print(perms) 

या - के रूप में John Coleman से बाहर poined - एक पंक्ति में:

perms = set(permutations(a)) 
+0

यह शायद छोटे उदाहरणों के लिए ठीक है, लेकिन इसमें एन उत्पन्न करना शामिल है! क्रमपरिवर्तन जब अलग-अलग क्रमिक क्रमों की संख्या बहुत छोटी हो सकती है –

+0

@ जॉन कॉलेमैन: मैं सहमत हूं। लेकिन जैसा कि मुझे नहीं पता कि नमूना कितना बड़ा है ... यह सिर्फ काम कर सकता है। –

+0

जैसा कि अक्सर पायथन में होता है, यह पैमाने का सवाल है। यह छोटे उदाहरणों के लिए एक पूरी तरह से अच्छा दृष्टिकोण है (यही कारण है कि मैंने इसे ऊपर उठाया)। बड़े उदाहरणों के लिए आप मल्टीसेट समर्थन के साथ लाइब्रेरी का उपयोग करना चाहेंगे (जैसा कि दूसरे उत्तर में है)। –