2013-08-28 55 views
4
a = [1, 2, 3, 4, 5, 6] 
# OR ! 
a = ['one', 'two', 'three', 'four', 'five', 'six'] 

在這種情況下,我只想知道所有可能的組合;選擇k元素當中的a。如果我使用b = scipy.misc.comb(a, 1),它表明:Python SciPy n選擇k的可能案例

b = [1, 2, 3, 4, 5, 6] 

其中b 只是一個選擇1.如果一個是一個字符串數組這是行不通的。

我真正想要的是:

b = [[1], [2], [3], [4], [5], [6]] 
# OR ! 
b = [['one'], ['two'], ['three'], ['four'], ['five'], ['six']] 

這意味着,該陣列一個

這是很容易的,如果我使用MATLAB中的元素之間的可能集合1箇中選擇元素。但我正在嘗試使用SciPy堆棧。

回答

7

對於這個特殊問題,使用scipy而不是itertools的任何理由?

縱觀itertools.combinationsitertools.permutations可能會提供更適當的解決方案。

+0

哇。非常感謝。對於科學和數學,我是Python的新手。所以這是我第一次聽說過itertools。 – songsong

+0

很高興我可以傳遞知識:) – Dman2

4

這是一個比較完整的答案。 你應該使用itertools.combinations而不是itertools.permutations作爲組合是非常不同於排列。

例如,如果您需要數組的所有兩個元素組合,如[1,2,3,5],則以下代碼將生成所需結果(相當於Matlab中的nchoosek)。查看更多示例from this source

>>> import itertools 
>>> all_combos = list(itertools.combinations([1,2,3,5], 2)) 
>>> print all_combos 
[(1, 2), (1, 3), (1, 5), (2, 3), (2, 5), (3, 5)] 

如果你想所有的組合爲一個二維數組元組列表只是轉換到使用下面的命令numpy的數組:

>>> all_combos = np.array(list(itertools.combinations([1,2,3,5], 2))) 
>>> print all_combos 
[[1 2] 
[1 3] 
[1 5] 
[2 3] 
[2 5] 
[3 5]]