Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类似于MATLAB的python切片_Python_Matlab_List_Slice - Fatal编程技术网

类似于MATLAB的python切片

类似于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)。有没有一种快速的“蟒蛇式”方法 试

在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[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']
注:

  • 从Matlab(基于1的索引)到Python(基于0的索引)的范围
  • 如果使用Python2.x,您可以将
    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类型切片的东西。