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

在这种情况下,我只想知道所有可能的组合;在a中选择k个元素。如果我使用,它显示:b = scipy.misc.comb(a, 1)

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

其中 b i只是 a我选择 1。如果a是字符串数组,则它不起作用。

我真正想要的是:

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

这意味着,数组中的元素中可能包含 1 个选定元素的集合a

如果我使用 MATLAB,这很容易。但我正在尝试使用 SciPy 堆栈。

4

2 回答 2

12

这是一个更完整的答案。您应该使用itertools.combinations而不是itertools.permutationsas 组合与排列非常不同。

例如,如果您需要数组的所有两个元素组合,例如[1,2,3,5]以下代码将产生您想要的结果(相当于nchoosekMatlab 中的)。从这个来源查看更多示例。

>>> 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]]
于 2016-05-25T16:38:57.493 回答
9

有什么理由使用scipy而不是itertools针对这个特定问题?

研究itertools.combinationsitertools.permutations可能提供更充分的解决方案。

于 2013-08-28T12:42:23.387 回答