2013-06-28 14 views
13

私は、問題の計算に困っているスライス表記でいくつかのPythonコードを見つけました。 それはスライス表記のように見えるが、カンマやリストを使用しています:カンマ/リスト付きのPythonスライス表記

list[:, [1, 2, 3]] 

は有効な構文ですか?もしそうなら、それは何をしますか?

編集が、それは2D numpyの配列

+0

あなたは特定の 'list'がリストですか?それは珍しい方法で '__getitem__'をオーバーライドするクラスのインスタンスかもしれません。 – Kevin

+0

タイプ(リスト)を試しましたか?数が少ない配列またはpandasデータフレームである可能性があります。 – mattexx

+0

@mattexx、私はコード全体を持っていませんが、これはnumpyとpandasで何をするのですか? – Stephan

答えて

14

これはadvanced indexingとして知られており、指定された列を選び出すされ、オブジェクトが本当にnumpy配列であると仮定すると:これは標準のPythonリストでは動作しないこと

>>> import numpy as np 
>>> a = np.arange(12).reshape(3,4) 
>>> a 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 
>>> a[:, [1,2,3]] 
array([[ 1, 2, 3], 
     [ 5, 6, 7], 
     [ 9, 10, 11]]) 
>>> a[:, [1,3]] 
array([[ 1, 3], 
     [ 5, 7], 
     [ 9, 11]]) 

注:

>>> a.tolist() 
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]] 
>>> a.tolist()[:,[1,2,3]] 
Traceback (most recent call last): 
    File "<ipython-input-17-7d77de02047a>", line 1, in <module> 
    a.tolist()[:,[1,2,3]] 
TypeError: list indices must be integers, not tuple 
1

あるようですが、複雑な値を生成し、__*item__()に渡しになります。

>>> class Foo(object): 
... def __getitem__(self, val): 
...  print val 
... 
>>> Foo()[:, [1, 2, 3]] 
(slice(None, None, None), [1, 2, 3]) 

何が実際に行いはインデックス化されているタイプに依存します。

関連する問題