NumPy Dizileri: Giriş [Örneklerle]
Yayınlanan: 2022-12-08NumPy'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.
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)
venp.argmin(array)
öğelerini de kullanabilirsiniz. NumPyargmax()
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.