Python SciPy中n选k的可能情况

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]

其中 bi 只是 ai 选择 1。如果 a 是一个字符串数组,它将不起作用。

我真正想要的是:

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

这意味着,在数组a的元素中选择1个元素的可能集合。

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

2个回答

12

这里是一个更完整的答案。你应该使用 itertools.combinations 而不是 itertools.permutations,因为组合与排列非常不同。

例如,如果你需要一个数组的所有两个元素的组合,比如 [1,2,3,5],下面的代码将产生你想要的结果(相当于 Matlab 中的 nchoosek)。查看更多示例,请参见此来源

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

如果您想要将所有组合作为2D数组,只需使用以下命令将元组列表转换为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]]

9

为什么在这个特定问题中要使用scipy而不是itertools

研究一下itertools.combinationsitertools.permutations可能会提供更合适的解决方案。


哇,非常感谢。我是科学和数学方面的Python新手,所以这是我第一次听说itertools。 - user2211319

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接