在Python中类似MATLAB的切片

4 投票
3 回答
2293 浏览
提问于 2025-04-16 16:35

在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时,这样就不行了。使用range(2),4,6会返回([0,1,2],4,6),而不是(0,1,2,4,6)。有没有快速且“符合Python风格”的方法呢?

3 个回答

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

一种方法是使用 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. 如果你使用的是Python 2.x,可以把 range 改成 xrange,这样可以避免一次性生成整个范围的列表。我觉得这对性能影响不大,但知道这一点还是不错的。
14

如果你想在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']

撰写回答