Python’a göre Numpy çok farklı indeskleme yeteneklerine sahiptir. Daha önce gördüğümüz klasik indeksleme özellikleri yanı sıra, bir array yine bir integer veya boolean array’le indekslenebilir.
06.01. Integer bir array ile indeksleme
1 2 3 4 5 |
a = np.arange(12)**2 # 0'dan başlayarak ardışık 12 sayının karesi array'i i = np.array( [ 1,4,3,8,5 ] ) # İstenen değer indisleri print('a[i]:',a[i]) # a dizisindeki elemanları elde etme j = np.array( [ [ 3, 4], [ 9, 7 ] ] ) # indisler ile çok boyutlu bir dizi oluşturma print('a[j]:',a[j]) |
1 2 3 |
a[i]: [ 1 16 9 64 25] a[j]: [[ 9 16] [81 49]] |
Görüldüğü gibi tek boyutlu veya çok boyutlu dizi oluşturulabilir. Hata iki indis ile veri çekilebilir. Örneğin,
1 2 3 4 5 6 7 8 9 10 11 12 |
a = np.arange(12).reshape(3,4) print('a:', a) i = np.array( [ [0,1], # ilk indis [1,2] ] ) j = np.array( [ [2,1], # ikinci indisler [3,3] ] ) print('a[i,j]:', a[i,j]) print('a[i,2]:', a[i,2]) print('a[:,j]:', a[i,2]) l = (i,j) #tuple olmasına dikkat print('a[l]:', a[l]) #a[i,j] ile aynı sonucu verir |
1 2 3 4 5 6 7 8 9 10 11 |
a: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] a[i,j]: [[ 2 5] [ 7 11]] a[i,2]: [[ 2 6] [ 6 10]] a[:,j]: [[ 2 6] [ 6 10]] a[l]: [[ 2 5] [ 7 11]] |
Boyut olayı size kalmış, i, j, k, m ve vb. kadar indisiniz olabilir. Tabii kodu yönetmenin gittikçe zorlaştığını unutmayın. Şimdi çok boyutlu bir dizi de bir kolon’un maksimum değerlerinin indislerini bulup, bu indisleri diğer bir array’de kullanalım.
1 2 3 4 5 6 7 8 9 10 |
time = np.linspace(20, 145, 5) # zaman data = np.sin(np.arange(20)).reshape(5,4) # 5x4'lük bir dizi print('time', time) print('data', data) inds = data.argmax(axis=0) # her serinin maximum değerini döndürür print(inds) time_max = time[inds] # zaman bilgisini döndürür data_max = data[inds, range(data.shape[1])] # => data bilgisi print('time_max:', time_max) print('data_max:', data_max) |
1 2 3 4 5 6 7 8 9 |
time [ 20. 51.25 82.5 113.75 145. ] data [[ 0. 0.84147098 0.90929743 0.14112001] [-0.7568025 -0.95892427 -0.2794155 0.6569866 ] [ 0.98935825 0.41211849 -0.54402111 -0.99999021] [-0.53657292 0.42016704 0.99060736 0.65028784] [-0.28790332 -0.96139749 -0.75098725 0.14987721]] [2 0 3 1] time_max: [ 82.5 20. 113.75 51.25] data_max: [0.98935825 0.84147098 0.99060736 0.6569866 ] |
Burada time ve data farklı array yaratma teknikleri ile yaratıldı. data.argmax(axis=0) her kolon’un en büyük indis değeri seçildi. Ardından bu indisler time ve data üzerinden verileri çekmekte kullanıldı. Şimdi birden fazla indisi güncelleme olayına bakalım.
1 2 3 4 5 6 7 8 9 10 |
a = np.arange(5) print('a:',a) a[[1,3,4]] = 0 print('güncellenmiş a:',a) b = np.arange(5) b[[0,0,2]]=[1,2,3] print('güncellenmiş b:',b) c = np.arange(5) c[[0,0,2]]+=1 print('güncellenmiş c:', c) |
1 2 3 4 |
a: [0 1 2 3 4] güncellenmiş a: [0 0 2 0 0] güncellenmiş b: [2 1 3 3 4] güncellenmiş c: [1 1 3 3 4] |
Atama işlemi tek değer aldığında tüm indisleri değiştirir. Atama işleminde birden fazla değer varsa indis ve değer sayısı uyuşmalıdır. Ayrıca indis güncellemesi +=, *=, -= vb. şekilde yapılabilir.
06.02. Boolean bir array ile indeksleme
Boolean bir array oluşturup sadece belirli indisleri seçme şansımız vardır. Ancak seçim sonrası çok boyutlu bir dizi tek boyuta indirgenmiş olur. İstenildiği taktirde bu tek boyutlu dizinin shape özelliği değiştirilebilir. Basit bir örnek:
1 2 3 4 5 |
a = np.arange(12).reshape(3,4) print('a:', a) bool_array = a > 4 # print('bool_array', bool_array) #boolean array print('a[bool_array]:',a[bool_array]) #true olan değerler |
1 2 3 4 5 6 7 |
a: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] bool_array [[False False False False] [False True True True] [ True True True True]] a[bool_array]: [ 5 6 7 8 9 10 11] |
bool_array’e a>4 durumunu sağlayan değerler true, sağlamayanlar ise false olarak aktarılır. Eğer bu array indis olarak kullanılırsa tek boyutlu True değerleri içeren bir dizi döndürülür.
Tüm True değerler atama işlemi ile güncellenebilir. Örneğin tüm True değerleri “0” yapalım.
1 2 |
a[bool_array] = 0 # güncelleme işlemi print('Güncellenmiş a: ', a) |
1 2 3 |
Güncellenmiş a: [[0 1 2 3] [4 0 0 0] [0 0 0 0]] |
06.03. ix_() fonksiyonu
ix_ fonksiyonu, farklı vektörleri birleştirip sonuç elde etmek için kullanılabilir. Örneğin, a, b ve c vektörlerinin a+b*c şeklinde bir hesabını yapalım. Örneğin,
1 2 3 4 5 6 7 8 9 10 11 12 13 |
a = np.array([2,3,4,5]) b = np.array([8,5,4]) c = np.array([5,4,6,8,3]) ax,bx,cx = np.ix_(a,b,c) print('ax:', ax) print('bx:', bx) print('cx:', cx) print('shape ax:', ax.shape) print('shape bx:', bx.shape) print('shape cx:', cx.shape) result = ax+bx*cx print('result:',result) print('hesapla result[3,2,4]:',result[3,2,4]) #a[3]+b[2]*c[4] aynı kapıya çıkar |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
ax: [[[2]] [[3]] [[4]] [[5]]] bx: [[[8] [5] [4]]] cx: [[[5 4 6 8 3]]] shape ax: (4, 1, 1) shape bx: (1, 3, 1) shape cx: (1, 1, 5) result: [[[42 34 50 66 26] [27 22 32 42 17] [22 18 26 34 14]] [[43 35 51 67 27] [28 23 33 43 18] [23 19 27 35 15]] [[44 36 52 68 28] [29 24 34 44 19] [24 20 28 36 16]] [[45 37 53 69 29] [30 25 35 45 20] [25 21 29 37 17]]] hesapla result[3,2,4]: 17 |