2011-04-28 47 views
1

在Matlab中,分層可以是一個向量:切片在Python類似於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」的方式嗎?

回答

10

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

++,不錯,對'r_'不瞭解 – 2011-04-29 04:27:42

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]) 
+1

這將複製列表。浪費更大的範圍。使用'itertools.chain'來避免這種情況。 – delnan 2011-04-28 13:14:57

4

一種方法是使用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. 您可以通過改變rangexrange如果你有Python的2.x中,以避免造成對飛的整個範圍列表獲得。我不認爲它會產生很大的性能差異,但很高興知道。