NumPy Dizileri: Giriş [Örneklerle]

Yayınlanan: 2022-12-08

NumPy'yi kullanmaya başlamak mı istiyorsunuz? Bu kılavuz size Python'daki NumPy dizilerinin temellerini öğretecektir.

İlk adım olarak, NumPy dizilerinin Python listelerinden nasıl farklı çalıştığını öğreneceksiniz. Ardından, NumPy dizileri oluşturmanın ve bunlar üzerinde temel işlemleri gerçekleştirmenin birkaç yolunu öğreneceksiniz.

Hadi başlayalım!

NumPy Dizilerinin Temelleri

NumPy, bilimsel bilgi işlem ve veri analizi için en popüler Python kitaplıklarından biridir. NumPy'deki temel veri yapıları, N boyutlu dizilerdir (ND dizileri). Yayın yeteneklerine sahipler ve işlemleri hız için vektörleştirmemize ve performansı iyileştirmek için yerleşik matematiksel işlevleri kullanmamıza izin veriyorlar.

NumPy ile çalışmaya başlamak için öncelikle kütüphaneyi kurmalı ve çalışma ortamınıza aktarmalısınız. Pip aracılığıyla kurulabilen bir PyPI paketi olarak mevcuttur.

NumPy'yi kurmak için terminalinizi açın ve aşağıdaki komutu çalıştırın:

 pip3 install numpy

NumPy'yi yükledikten sonra, onu bir takma adla çalışma ortamınıza aktarabilirsiniz. Normal takma ad np .

 import numpy as np

Not : NumPy'yi np takma adı altında içe aktarmak bir gereklilik değil, önerilen bir kuraldır.

Python Listeleri ve NumPy Dizileri

Aşağıdaki Python sayı listesini göz önünde bulundurun:

 py_list = [1,2,3,4]

Argüman olarak listeyle birlikte np.array() işlevini çağırarak varolan bir listeden bir NumPy dizisi elde edebilirsiniz.

 np_arr1 = np.array(py_list) print(np_arr1) [1 2 3 4]

np_arr1 türünü kontrol etmek için yerleşik type() işlevini çağırırsınız, bunun ndarray temel veri yapısı olan ndarray olduğunu görürsünüz.

 type(np_arr1) # numpy.ndarray

Python listesi ve NumPy dizisi benzer görünse de bazı farklılıklar vardır:

  • Bir Python listesi, farklı veri türlerindeki nesneleri tutabilirken, bir NumPy dizisi aynı veri türündeki öğeleri içerir. Varsayılan veri türü, 64 bit hassasiyetle (float64) float'tır.
  • Bir Python listesinin öğeleri, bellekte bitişik konumlarda saklanmak zorunda değildir. Bununla birlikte, bir NumPy dizisinin öğeleri, bellekte bitişik bir blokta saklanır. Sonuç olarak, öğeleri aramak ve bunlara erişmek daha hızlıdır.

Diğer birkaç farkın üzerinden geçelim.

yayın

NumPy dizilerinin güçlü bir özelliği yayın yapıyor. Diyelim ki np_arr1 ve py_list öğelerinin tüm öğelerine 2 eklemek istiyoruz.

py_list 2 eklemeyi deneyelim ve ne olduğunu görelim:

 >>> py_list + 2

Sadece iki listeyi birleştirebileceğimizi ve bunun gibi py_list + 2 eklenmesinin desteklenmediğini belirten bir TypeError aldığımızı görüyoruz.

 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-5-c0f9974899df> in <module> ----> 1 py_list + 2 TypeError: can only concatenate list (not "int") to list

Aynı işlemi np_arr1 dizisinde deneyelim.

 >>> np_arr1 + 2

Sonuçta dizinin her elemanına 2 eklendiğini görüyoruz.

 array([3, 4, 5, 6])

Bunun nedeni, NumPy'nin bu sonucu elde etmek için skaler 2'yi uyumlu bir şekil dizisine dolaylı olarak yayınlamasıdır.

vektörizasyon

NumPy dizileri, daha hızlı öğe bazında işlemler için vektörleştirmeyi destekler. İki dizinin eleman bazında toplamını bulmak istediğimizi varsayalım.

Listede basit bir + işlemi kullanmak, iki listenin birleşimini döndürür (istediğimiz bu değil!).

 >>> py_list + py_list # [1, 2, 3, 4, 1, 2, 3, 4]

Ancak NumPy dizisindeki aynı işlem, np_arr1 , kendisiyle birlikte np_arr1 öğesinin öğe bazındaki toplamını döndürür.

 >>> np_arr1 + np_arr1 # array([2, 4, 6, 8])

Benzer şekilde, iç içe geçmiş listeler yapı olarak N boyutlu bir NumPy dizisine benzer görünebilir. Ancak, şimdiye kadar tartışılan farklılıklar geçerli.

 nested_list = [[1,2],[3,4],[5,6]] np_arr2 = np.array(nested_list) print(np_arr2)
 [[1 2] [3 4] [5 6]]

NumPy Dizileri Nasıl Oluşturulur

np.array(list-obj) kullanarak her zaman mevcut Python listelerinden NumPy dizileri oluşturabilirsiniz. Ancak, bu en etkili yol değildir.

Bunun yerine, belirli bir şekle sahip diziler oluşturmanıza izin veren birkaç yerleşik işlevi kullanabilirsiniz. Dizinin şekli, her boyut boyunca dizinin boyutunu gösteren bir demettir. Örneğin, iki satır ve iki sütun içeren 2×2 dizisinin şekli (2,2)'dir. Bu bölümde, bu yerleşik işlevlerden bazılarının nasıl kullanılacağını öğreneceğiz.

NumPy Dizileri Nasıl Oluşturulur

Sıfır ve Bir Dizileri Oluşturma

Tümü sıfırlarla veya tümü birlerle doldurulan belirli boyutlardan oluşan bir dizi oluşturmak genellikle yararlıdır. Ardından bunları kullanın ve programın sonraki adımlarında değiştirin.

Bir sıfır dizisi oluşturmak için zeros() işlevini kullanabiliriz. Gerekli dizinin şeklini bir demet olarak geçirin: np.zeros(shape) .

 array0 = np.zeros((3,3)) print(array0)

İşte çıktı, 2B sıfır dizisi:

 [[0. 0. 0.] [0. 0. 0.] [0. 0. 0.]]

Aşağıda gösterildiği gibi, NumPy dizisinin özniteliklerine, dtype ve shape gibi çağrı özniteliklerine nokta gösterimini kullanarak erişebilirsiniz:

 print(array0.dtype) # float64 print(array0.shape) # (3, 3)

Bir dizi elde etmek için np.ones() işlevini kullanabilirsiniz.

 array1 = np.ones((3,3)) print(array1)
 [[1. 1. 1.] [1. 1. 1.] [1. 1. 1.]]

Kimlik Matrisi Oluşturma

Kimlik matrisi, lineer cebirin çeşitli uygulamalarında yaygın olarak kullanılmaktadır. Ve bir kimlik matrisi oluşturmak için np.eye() işlevini kullanabilirsiniz. np.eye() işlevi yalnızca bir argüman alır: matrisin sırası ( n ).

 arrayi = np.eye(3) print(arrayi)
 [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]]

Rastgele Sayı Dizileri Oluşturma

Belirli dağılımlardan alınan rasgele sayılarla doldurulmuş belirli bir şekle sahip diziler de oluşturabilirsiniz. Yaygın olarak kullanılan olasılık dağılımları, düzgün dağılım ve standart normal dağılımdır.

NumPy'nin random modülünün bir parçası olan randn() işlevi, standart bir normal dağılımdan örneklenen sayı dizileri oluşturmak için kullanılabilir. Standart normal dağılım, sıfır ortalama ve birim varyansa sahip bir Gauss dağılımıdır.

 std_arr = np.random.randn(3,4) print(std_arr)
 [[-0.13604072 1.21884359 2.06850932 0.78212093] [ 0.44314719 -0.78084801 -0.70517138 1.17984949] [ 1.13214829 1.02339351 0.15317809 1.83191128]]

np.random.rand() , [0,1] aralığı boyunca tekdüze bir dağılımdan örnek bir sayı dizisi döndürür.

 uniform_arr = np.random.rand(2,3) print(uniform_arr)
 [[0.90470384 0.18877441 0.10021817] [0.741 0.10657658 0.71334643]]

NumPy'nin rasgele modülünün bir parçası olan randint() işlevini kullanarak bir rasgele tamsayılar dizisi de oluşturabilirsiniz. np.random.randint(low, high, size) bir tamsayı dizisi döndürür. Dizinin şekli size bağımsız değişkeninden çıkarılır ve tamsayılar [low,high) aralığındaki değerleri alır.

İşte bir örnek:

 int_arr = np.random.randint(1,100,(2,3)) print(int_arr)
 [[53 89 33] [24 85 33]]

Diğer Yararlı Yerleşik İşlevler

Ardından, NumPy dizileri oluşturmak için birkaç başka yararlı işlevin üzerinden geçelim.

arange() işlevi, bir start ​​ve stop değeri arasında bir step değerinin adımlarında bir sayı dizisi döndürür: start , start + step , start + 2*step up to ama stop dahil değil. start ​​ve step değerleri isteğe bağlıdır . Varsayılan adım boyutu 1'dir ve varsayılan başlangıç ​​değeri 0'dır.

Bu örnekte, array_a , 1'den başlayarak 0,5'lik adımlarla 10'a kadar giden bir sayı dizisidir.

 array_a = np.arange(1,10,0.5) print(array_a)
 [1. 1.5 2. 2.5 3. 3.5 4. 4.5 5. 5.5 6. 6.5 7. 7.5 8. 8.5 9. 9.5]

np.linspace() kullanarak eşit aralıklı sayı dizileri de oluşturabilirsiniz. start ​​ve stop değerleri arasında eşit aralıklı sayılardan oluşan bir dizi elde etmek için np.linspace(start, stop, num) num .

Burada arr_lin , [1,10] aralığında eşit aralıklı 5 sayıdan oluşan bir dizidir.

 array_lin = np.linspace(1,10,5) print(array_lin)
 [ 1. 3.25 5.5 7.75 10. ]

Benzer şekilde arr_lin2 , [1,20] aralığında eşit aralıklı 10 sayıdan oluşan bir dizidir.

 array_lin2 = np.linspace(1,20,10) print(array_lin2)
 [ 1. 3.11111111 5.22222222 7.33333333 9.44444444 11.55555556 13.66666667 15.77777778 17.88888889 20. ]

arange() işlevinden farklı olarak, linspace() işlevi varsayılan olarak uç noktayı içerir .

NumPy Dizilerinde Temel İşlemler

Şimdi, NumPy dizilerindeki bazı temel işlemleri gözden geçirelim.

Minimum ve Maksimum Elemanları Bulma

Dizi oluşturmak için NumPy'nin rastgele modülündeki işlevleri kullandığımızda, kodun her çalıştırılışında farklı bir sonuç alırız. Tekrarlanabilir sonuçlar elde etmek için bir tohum ayarlamalıyız: np.random.seed(seed_value) .

Aşağıdaki örnekte, yeniden üretilebilirlik için çekirdeği ayarladım, int_arr1 [1,100] aralığında yedi rasgele tam sayıdan oluşan bir dizidir.

 np.random.seed(27) int_arr1 = np.random.randint(1,100,7) print(int_arr1) # [20 57 73 32 57 38 25]
  • Dizideki maksimum öğeyi bulmak için, dizi nesnesi olan int_arr1 max() yöntemini çağırabilirsiniz ve
  • Dizideki minimum öğeyi bulmak için dizi nesnesi olan int_arr1 min() yöntemini çağırabilirsiniz.
 int_arr1.max() # 73 int_arr1.min() # 20

Maksimum ve Minimum Öğelerin Dizinini Bulma

Bazen, maksimum ve minimum öğelerin dizinini bulmanız gerekebilir. Bunu yapmak için dizi nesnesinde argmax() ve argmin() yöntemlerini çağırabilirsiniz.

Burada maksimum eleman 73 indeks 2'de oluşur.

 int_arr1.argmax() # 2

Ve minimum eleman 20, indeks 0'da gerçekleşir.

 int_arr1.argmin() # 0

Sırasıyla maksimum ve minimum öğelerin indekslerini bulmak için np.argmax(array) ve np.argmin(array) öğelerini de kullanabilirsiniz. NumPy argmax() işlevi hakkında daha fazla bilgi edinin.

NumPy Dizileri Nasıl Birleştirilir

NumPy dizileriyle yapmak isteyebileceğiniz başka bir yaygın işlem de birleştirmedir.

vstack Kullanarak Dikey Birleştirme

vstack() işlevini kullanarak dizileri dikey olarak birleştirebilirsiniz.

İşte bir örnek. arr1 , iki satır ve üç sütundan oluşan bir dizidir ve arr2 , iki satır ve üç sütundan oluşan bir sıfır dizisidir.

 arr1 = np.ones((2,3)) arr2 = np.zeros((2,3))

Bu iki diziyi, gösterildiği gibi vstack() işlevini kullanarak dikey olarak birleştirebiliriz:

 np.vstack((arr1,arr2))
 array([[1., 1., 1.], [1., 1., 1.], [0., 0., 0.], [0., 0., 0.]])

İstifleme dikey olarak gerçekleştiğinden, iki dizi aynı sayıda sütuna sahip olmalıdır.

arr2 (2,2) şeklinde değiştirelim. Artık iki satırı ve iki sütunu var.

 arr1 = np.ones((2,3)) arr2 = np.zeros((2,2)) np.vstack((arr1,arr2))

Bu nedenle, dikey birleştirme mümkün değildir ve bir ValueError alırız.

 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-21-d5d3bf37fc21> in <module> ----> 1 np.vstack((arr1,arr2)) ValueError: all the input array dimensions for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 3 and the array at index 1 has size 2

hstack Kullanarak Yatay Birleştirme

Aşağıda gösterildiği gibi, hstack() işlevini kullanarak NumPy dizilerini yatay olarak birleştirebilirsiniz.

 arr1 = np.ones((3,3)) arr2 = np.zeros((3,2))
 np.hstack((arr1,arr2))

Yığınlama yatay olarak gerçekleştiğinden, giriş dizileri aynı sayıda satıra sahip olmalıdır. Burada hem arr1 hem de arr2 üç satırı vardır.

 array([[1., 1., 1., 0., 0.], [1., 1., 1., 0., 0.], [1., 1., 1., 0., 0.]])

Birleştirmeyi kullanma

concatenate() işlevini kullanarak NumPy dizilerini belirli bir eksen boyunca birleştirerek de kullanabilirsiniz. İsteğe bağlı axis bağımsız değişkenini, birlikte birleştirmek istediğiniz eksene ayarlayın; eksenin varsayılan değeri sıfırdır.

İşte birkaç örnek:

 arr1 = np.ones((2,3)) arr2 = np.zeros((2,3))

Boyunca birleştirilecek ekseni belirtmediğimizde, diziler 0 ekseni boyunca birleştirilir. Ortaya çıkan dizide, ikinci dizi arr2 birinci dizinin altına (satırlar olarak) eklenir.

 np.concatenate((arr1,arr2))
 array([[1., 1., 1.], [1., 1., 1.], [0., 0., 0.], [0., 0., 0.]])

axis = 1 belirttiğimizde aşağıdaki sonucu alırız. arr2 , ilk dizinin yanında birleştirilir (sütunlar olarak), arr1 .

 np.concatenate((arr1,arr2),axis=1)
 array([[1., 1., 1., 0., 0., 0.], [1., 1., 1., 0., 0., 0.]])

hstack() ve vstack() işlevlerinde olduğu gibi , birleştirme ekseni boyunca dizilerin boyutları eşleşmelidir .

Çözüm

Bu eğitimde, N-boyutlu dizilerin hız ve verimlilik açısından avantajlarına odaklanarak NumPy dizileri ile Python listeleri arasındaki farkları öğrendiniz.

Ayrıca, belirli bir boyutta diziler oluşturmak ve minimum ve maksimum öğeleri bulmak, dizileri birleştirmek ve daha fazlası gibi yaygın işlemleri gerçekleştirmek için birçok yararlı işlevi de öğrendiniz.

Ardından, NumPy dizilerini nasıl yeniden şekillendireceğinizi öğrenin.