在python中切片类似于MATLAB

时间:2011-04-28 13:09:15

标签: python matlab list slice

在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)。有快速和“pythonic”的方式吗?

3 个答案:

答案 0 :(得分:11)

如果你想在Python中做类似于Matlab的事情,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']

答案 1 :(得分:4)

一种方法是使用itertools.chain

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

注意:

  1. Ranges改编自Matlab(基于1的索引)到Python(基于0的索引)
  2. 如果您使用Python 2.x,则可以将range更改为xrange,以避免动态创建整个范围列表。我不认为它会产生很大的性能差异,但很高兴知道。

答案 2 :(得分:3)

尝试

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