2011-11-11 2 views
1

numpyののndarrayクラスが__builtin__.objectsが反復可能なタイプではありません、私が集めることができるものからnumpy.ndarrayの反復可能な振る舞いはどこから来ますか?

class ndarray(__builtin__.objects) 

として定義されていますか?

Arr = numpy.array('As Far As I Know'.split()) 
=> array(['As', 'Far', 'As', 'I', 'Know'], dtype='|S4') 
print map(lambda x: x[0],Arr) 
=> ['A', 'F', 'A', 'I', 'K'] 

それともこれはndarray__init__メソッドに渡される(list)オブジェクトの属性から来るん:このような理由から、私は驚くべきことでは、この動作を見つけますか?しかし、配列オブジェクトにlist.reverseのようなメソッドを使用できないのはなぜですか?内部的にリストとして格納されているのですか?

(および側は誰もがndarrayオブジェクトの各要素に文字列操作を適用するために任意のより良い方法を知っているんではないと?)

+0

Guidoは '' python regrets ''として 'map'と' lambda'をリストしていますので、 '' np.array([k [x]にはk [0])のようなリスト内包を好む傾向があります ' – wim

+0

はい、私はこの議論に厳密に従いました(彼は私の知る限り、 'reduce'と' lambda'を必要としませんが、 'map'は嫌いですが)' x'は上記の例で 'map'と' lambda'を使用するローカル変数です。あなたが示したように、リストの理解の使用において、 'k 'はグローバルである。私はその理由のためにリスト内包を受け入れることができません。 – hatmatrix

+1

@crippledlambda:Python 3では、リスト内包表記のループ変数は、もはや囲みスコープにリークされません。これをPython 2で流出させたくない場合は、 '[... for x in a]'を 'list(... in x in a)'に変換することができます。 –

答えて

5

numpy.ndarrayはのインスタンスを作るために__iter__()、通常の(そして唯一の)メカニズムを定義iterableを入力します。 numpy.ndarrayはCの拡張型ですが、これはなぜiterableなのかは問題ではありません。 PythonとCの拡張の型で定義する型はどちらも、__iter__()を定義することによって反復可能にすることができます。

+0

ああ、それは継承されていませんが、特別に定義されています。チェック。 – hatmatrix

関連する問題