6.8. Operatörler

numpy‘nın bir ndarray üzerinde çalıştırdığı ilk matematik türü, standart Python operatörleridir. Aritmetik, karşılaştırma ve bit bazında operatörlerin hepsi eleman bazında çalışır – her operatör, diziyi (veya her iki diziyi) tek bir kütüphane çağrısı içinde baştan sona bir kez gezer ve bu, eşdeğer Python for döngüsünden çok daha hızlıdır.

6.8.1. Aritmetik

+, -, *, /, //, %, ** operatörlerinin hepsi, uyumlu şekle sahip iki dizi arasında veya bir dizi ile bir skaler arasında çalışır:

a = np.array([1, 2, 3, 4], dtype=np.float)
b = np.array([10, 20, 30, 40], dtype=np.float)

print(a + b)        # array([11.0, 22.0, 33.0, 44.0])
print(a * 2)        # array([2.0, 4.0, 6.0, 8.0])
print(b - a)        # array([9.0, 18.0, 27.0, 36.0])
print(b / a)        # array([10.0, 10.0, 10.0, 10.0])

Sonuç dtype’ı, Dtype’lar‘ta açıklanan yukarı tür dönüştürme kurallarını izler. Tamsayı dizileri taşmada kendi etrafına sarar; bu önemli olduğunda işlemden önce daha geniş bir dtype’a dönüştürün.

Matris çarpımı operatörü @ uygulanmamıştır. Matris / vektör çarpımları için dot() kullanın.

6.8.1.1. Yerinde biçimler

Her aritmetik operatörün bir yerinde biçimi vardır – +=, -=, *=, /=, %=, **=. Yerinde biçim, geçici bir tane ayırmak yerine mevcut arabellek üzerine yazar:

b = b + 1            # allocates a temporary the size of b
b += 1               # no temporary

Bir mikrodenetleyicide ikinci biçim, herhangi bir sıcak döngü için esasen zorunludur.

6.8.2. Bit bazında

Bit bazında operatörler &, |, ^, tamsayı dizileri üzerinde eleman bazında çalışır. Bir float veya complex diziye uygulandıklarında TypeError yükseltirler:

a = np.array([0b1100, 0b1010], dtype=np.uint8)
b = np.array([0b1010, 0b1100], dtype=np.uint8)
print(a & b)        # array([8, 8], dtype=uint8)
print(a | b)        # array([14, 14], dtype=uint8)
print(a ^ b)        # array([6, 6], dtype=uint8)

Tekli ~, bir tamsayı dizisi üzerinde bit bazında DEĞİL işlemi gerçekleştirir.

Kaydırma operatörleri << ve >>, Python operatör düzeyinde bağlanmamıştır. Fonksiyon biçimleri left_shift() ve right_shift() çalışır:

np.left_shift(a, 2)
np.right_shift(b, 1)

6.8.3. Karşılaştırma

==, !=, <, <=, >, >= operatörlerinin hepsi, yayınlama şeklinde bir bool ndarray döndürür:

a = np.array([1, 2, 3, 4, 5], dtype=np.uint8)
print(a < 3)
# array([True, True, False, False, False], dtype=bool)

Boole sonucu, tam olarak indeksleme ve Seçim ve yeniden düzenleme‘ın tükettiği şeydir.

6.8.3.1. Taraf kuralı

Bir skalerle karşılaştırırken ndarray, bir ilişkisel operatörün solunda olmalıdır. a > 2 çalışır; 2 < a TypeError yükseltir. Simetrik biçim için fonksiyon adlarını kullanın:

np.greater(5, a)        # 5 > a, element-wise
np.less(5, a)           # 5 < a, element-wise
np.equal(5, a)          # 5 == a, element-wise
np.not_equal(5, a)      # 5 != a, element-wise

6.8.4. Tekli operatörler

  • +a – dizinin bir kopyasını döndürür.

  • -a – negatifleme. İşaretsiz dtype’larda değerler, ikili operatörlerle aynı şekilde \(2^N\) modülünde sarar.

  • abs(a) – eleman bazında mutlak değer. İşaretsiz dtype’larda hesaplama yapmadan bir kopya döndürür.

  • ~a – bit bazında tersine çevirme (yalnızca tamsayı dizileri).

  • len(a) – Python dizi kuralına uygun olarak ilk eksenin uzunluğunu döndürür.

6.8.5. Neler eksik

Karşılaştırma ve bazı bit bazında işlemler için sağ taraf operatörleri, aritmetik operatörlerle aynı şekilde uygulanmamıştır. Bir ndarray‘in sağda yer alacağı durumlarda fonksiyon biçimlerini (yukarıdaki) kullanın.

Desteklenen operatörlerin tam listesi ve izledikleri yukarı tür dönüştürme için bkz. numpy — numpy uyumlu dizi işlemleri.