2011-11-11 32 views
1

numpy的的ndarray類定義爲numpy.ndarray的迭代行爲來自哪裏?

class ndarray(__builtin__.objects) 

據我所知,__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將'map'和'lambda'列爲「python regrets」,所以我傾向於使用列表推導,例如'np.array([k [0] for k in x]' – wim

+0

是的,據我所知,我緊跟這一辯論(據我所知,他討厭'reduce'和'lambda',但不一定是'map'),但在上面的例子中'x'是一個使用'map'和'lambda'的局部變量;正如你所示,'k'在使用列表理解方面是全球性的。出於這個原因,我無法接受列表解析。 – hatmatrix

+1

@crippledlambda:在Python 3中,列表解析的循環變量不會再泄漏到封閉範圍。如果你想在Python 2中避免這種泄漏,你可以將'[... for x in a]'轉換爲'list(... for x in a)''。 –

回答

5

numpy.ndarray定義__iter__(),這通常也是唯一的機制使的情況下,類型可迭代。請注意,numpy.ndarray是C擴展類型,但這對於可迭代的問題無關緊要。在Python和C擴展類型中定義的類型都可以通過定義__iter__()進行迭代。

+0

啊,所以它不是繼承的,而是專門爲它定義的。檢查。 – hatmatrix