6.11. İndirgemeler¶
Bir indirgeme, bir diziyi toplama, ortalama alma, en küçüğü alma vb. işlemlerle bir veya daha fazla eksen boyunca daraltır. Her indirgeme, dizinin tamamı üzerinde tek bir kütüphane çağrısıdır ve eşdeğer Python döngüsünden çok daha hızlıdır. numpy günlük olarak kullanılanları kapsar:
sum()– her elemanın toplamımean()– aritmetik ortalama (toplamın eleman sayısına bölümü)std()– standart sapma,ddof=böleni ayarlar (N - ddof)median()– elemanlar sıralandığında ortadaki değer (50. yüzdebirlik)argmin()/argmax()– minimum veya maksimum elemanın indeksiall()/any()– boolean diziler üzerinde doğruluk değeri indirgemeleri
6.11.1. axis anahtar sözcüğü olmadan¶
axis= olmadan çağrıldığında, bir indirgeme tüm diziyi kapsayan bir skaler döndürür:
a = np.array([1, 2, 3, 4], dtype=np.float)
np.sum(a) # 10.0
np.mean(a) # 2.5
np.std(a) # 1.118...
np.median(a) # 2.5
b = np.array([40, 10, 30, 20], dtype=np.float)
np.max(b) # 40.0
np.argmax(b) # 0 (index of the maximum)
6.11.2. axis anahtar sözcüğü ile¶
axis=, adı belirtilen bir ekseni daraltır ve diğerlerini olduğu gibi bırakır. Sonuç, girdiden bir rank daha düşük bir dizidir:
m = np.arange(12, dtype=np.float).reshape((3, 4))
np.sum(m) # 66.0 - scalar
np.sum(m, axis=0) # length-4 - column sums
np.sum(m, axis=1) # length-3 - row sums
Aynı şekil kuralı her indirgeme için geçerlidir: axis=0 ilk ekseni daraltır, axis=1 ikinci ekseni daraltır vb. Örneğin bir satır boyunca ortalama / standart sapma, np.mean(m, axis=1) ve np.std(m, axis=1) şeklinde yazılır. Sonuç, diğer eksenin uzunluğuna sahip olur.
keepdims=True anahtar sözcüğü, daraltılan ekseni kaldırmak yerine uzunluğu 1 olacak şekilde yerinde tutar. Bu ayrım, indirgenen sonucun orijinale karşı geri yayınlanması gerektiğinde önem kazanır: keepdims rank’ı korur, bu da yayınlama kurallarını eksen eksen hizalı tutar.
Her satırın ortalamasını o satırdan çıkarmak, tipik bir kullanımdır:
m = np.arange(12, dtype=np.float).reshape((3, 4))
row_means = np.mean(m, axis=1, keepdims=True)
# row_means has shape (3, 1)
centred = m - row_means
# (3, 4) - (3, 1) -> (3, 4), each row centred on its own mean
keepdims olmadan, np.mean(m, axis=1) (3,) şeklinde 1 boyutlu bir sonuç döndürür. (3, 4) - (3,) yayınlaması, rank ekleme sonrasında (3,) ifadesini (1, 3) olarak hizalar; bu da (3, 4) ile uyumsuzdur: son eksenler uyuşmaz (4’e karşı 3) ve hiçbiri 1 değildir, bu yüzden numpy bir ValueError yükseltir. Çıkarmayı geçerli tutan şey keepdims=True ifadesidir.
6.11.3. Yerleşim önemlidir¶
Şekil ve adımlar belgesinde ele alınan satır-öncelikli (row-major) yerleşimle birlikte, son eksen boyunca indirgeme en ucuz durumdur. İndirgeme, veri bloğunu saklandığı yönde, satırdan satıra atlama yapmadan dolaşır:
m = np.arange(2000, dtype=np.float).reshape((2, 1000))
np.sum(m, axis=1) # cheap - long axis is the inner one
np.sum(m, axis=0) # has to jump rows on every step
Uygulama bir arabelleğin nasıl yerleştirileceği konusunda bir seçeneğe sahip olduğunda, uzun ekseni en sona koyun ki o eksen boyunca indirgemeler hızlı yönde çalışsın.
6.11.4. Girdi olarak yinelenebilirler (iterable)¶
Çoğu indirgeme, bir ndarray yerine bir Python yinelenebilirini (bir list, bir range, bir demet) kabul eder. Bu kolaylık, örtük dönüşüm için birkaç mikrosaniyeye mal olur – ki bu da bir döngüde hızla birikir. Aynı veri birden çok kez indirgendiğinde, ndarray nesnesini bir kez oluşturun ve etrafta dolaştırın.