2016-11-29 10 views
5

Numpy öğreniyorum.Neden python bulit-in işlevleri summ'nin datatype ndarrayını hesaplamak için sum(), max(), min() gibi işlevler kullanılabilir?

>>> import numpy as np 
>>> a = np.arange(10) 
>>> a.sum() 
45 

ve: Ama bazı sorular beni karıştı got sum(a) aynı sonucu verir. Peki, yerleşik bir işlev, bir üçüncü taraf kitaplığından bir veri türünün hesaplanmasını destekleyebilir? dk() ve max() aynı şeyi bu konuda iki tahmin var

(loş 1 olduğunda), ikincisini tercih:.

  1. piton çekirdek geliştirici ndarray desteği eklemek;
  2. bazı gizli nitelikler
  3. gerçekleşmesi ndarray marka içinde tanımlar. (Eğer öyleyse, o nedir?)

cevap

7

Bütün bir üçüncü taraf kütüphane tipi yapması gereken, bazen de denilen beklenen protokolünü (uygulamak olduğunu Bir arabirimi). sum() function documentation ne beklendiğini söyler:

Meblağlar başlayıp soldan sağa ve toplam döner bir iterable kalemleri .

min() ve max() devlet benzeri gereksinimler (bir iterable en büyük ürünü iade etme , bir iterable en küçük ürünü iade etme ).

Burada, standard types documentation'da açıklanan bir protokoldür. Protokoller kendileri değildir, sadece belirli bir şekilde davranması beklenen yöntemlerden birisidir.

>>> import numpy as np 
>>> from collections.abc import Iterable 
>>> a = np.arange(10) 
>>> isinstance(a, Iterable) 
True 

Yani ndarray tip bir iterable olduğunu ve sum() fonksiyonu olanlar toplayarak, dizideki bulunan tüm değerleri almak için kullandığı ne: collections.abc module bir şey bir protokol uygulaması halinde sınamak için kullanabileceğiniz birkaç nesneleri sağlar sizin için değerler. Python protokolleri dayanmaktadır Çünkü

, çekirdek dil geliştiricileri orada her üçüncü taraf kitaplığından desteği eklemek gerekmez. Bunun yerine, kütüphaneler sadece çekirdek dilin beklentilerini karşılar. ndarray.sum() uygulama tipi iç uygulaması yararlanabilirler

Not; Python ilk nesneler için (yineleme döndürür kutulu tip, bu durumda Python int nesneler iç gösterimi çıplak C tamsayıları içeren ederken,) iç verileri dönüştürmek zorunda değildir olarak muhtemelen, daha hızlı toplamı üretebilir.

+0

'np.sum (a, ...)' 'a.sum (...)' yi çalıştırmayı dener. Yani, dizi yöntemine (varsa) delege eder. Bu 'ndarray' alt sınıfları kendi detaylarını ekleyebilir. – hpaulj

İlgili konular