类似于MATLAB的python切片
在Matlab中,切片可以是向量:类似于MATLAB的python切片,python,matlab,list,slice,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)。有没有一种快速的“蟒蛇式”方法 试
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)。有没有一种快速的“蟒蛇式”方法 试试看
[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])
一种方法是使用
itertools.chain
:
>>> b = [a[i] for i in itertools.chain(range(2), [5, 6])]
>>> b
['b', 'c', 'f', 'g']
注:
range
更改为xrange
,以避免动态创建整个范围列表。我不认为这会对性能产生很大影响,但很高兴知道这一点如果您想在Python中做类似于Matlab的事情,NumPy应该始终是您的第一个猜测。在这种情况下,您需要
numpy.r\u
:
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']
这将复制列表。大范围的浪费。使用
itertools.chain
来避免这种情况。++,很好的一个,不知道r\u
注意r\u[:3,5:][/code>返回[0,1,2,0,1,2,3,4]
,因为它不知道a。解决方法是使用返回[0,1,2,5,6,7]
的r\u[:3,5:len(a)]
。仍然是最接近Matlab类型切片的东西。