Нарезка в питоне похожа на MATLAB - PullRequest
3 голосов
/ 28 апреля 2011

В Matlab срез может быть вектором:

a = {'a','b','c','d','e','f','g'}; % cell array
b = a([1:3,5,7]);

Как я могу сделать то же самое в Python?

a = ['a','b','c','d','e','f','g']
b = [a[i] for i in [0,1,2,4,6]]

но когда 1: 3 становится 1: 100, это не сработает. Используя диапазон (2), возвращается 4,6 ([0,1,2], 4,6), а не (0,1,2,4,6). Есть ли быстрый и «питонический» способ?

Ответы [ 3 ]

11 голосов
/ 28 апреля 2011

Если вы хотите сделать что-то похожее на Matlab в Python, NumPy всегда должен быть вашим первым предположением. В этом случае вам нужно numpy.r_:

from numpy import array, r_
a = array(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print a[r_[1:3, 5, 7]]

['b' 'c' 'f' 'h']
4 голосов
/ 28 апреля 2011

Один из способов использования itertools.chain:

>>> b = [a[i] for i in itertools.chain(range(2), [5, 6])]
>>> b
['b', 'c', 'f', 'g']

Примечания:

  1. Диапазоны адаптированы от Matlab (индексация на основе 1) к Python (индексация на основе 0)
  2. Вы можете выиграть, изменив range на xrange, если у вас есть Python 2.x, чтобы избежать создания всего списка диапазонов на лету. Я не думаю, что это сильно повлияет на производительность, но об этом приятно знать.
3 голосов
/ 28 апреля 2011

Попробуйте

[a[i] for i in range(2) + [4, 6]]

Если вы используете NumPy, у вас есть еще несколько вариантов:

import numpy as N
a = N.array(['a', 'b', 'c', 'd', 'e', 'f', 'g'])
b = a[range(2) + [4, 6]]
c = a.take(range(2) + [4, 6])
...