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 只是一个 i 选择1.如果 a 是一个字符串数组,它就不起作用。
我真正想要的是:
b = [[1], [2], [3], [4], [5], [6]]
# OR !
b = [['one'], ['two'], ['three'], ['four'], ['five'], ['six']]
表示数组 a
中元素中可能的1个选定元素的集合如果我使用MATLAB,这很容易。但我正在尝试使用SciPy堆栈。
答案 0 :(得分:8)
使用scipy
而不是itertools
来解决此特定问题的原因是什么?
调查itertools.combinations
或itertools.permutations
可能会提供更合适的解决方案。
答案 1 :(得分:6)
这是一个更完整的答案。
您应该使用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)]
如果您希望所有组合作为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]]