2013-08-28 3 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] 

где б я просто я выбрать 1. И это не работает, если является массивом строк.

То, что я действительно хотел это:

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

, что означает, возможный набор 1 выбранного элемента среди элементов в массиве

Это очень просто, если я использую MATLAB. Но я пытаюсь использовать стек SciPy.

ответ

7

Любые причины для использования scipy, а не itertools для данной конкретной проблемы?

Рассмотрение вопроса itertools.combinations или itertools.permutations может обеспечить более адекватное решение.

+0

Wow. Большое спасибо. Я новичок в Python для науки и математики. Так что я впервые услышал об itertools. – songsong

+0

Рад, что я смог передать знание :) – Dman2

4

Вот более полный ответ. Вы должны использовать itertools.combinations, а не itertools.permutations, так как комбинация сильно отличается от перестановки.

Например, если вам нужны все две комбинации элементов массива, такие как [1,2,3,5], следующий код даст результат, который вы хотите (эквивалент nchoosek в Matlab). См. Еще примеры 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]] 
Смежные вопросы