NumPy - Gelişmiş İndeksleme

Tuple olmayan bir dizi olan ndarray'den, tamsayıya sahip ndarray nesnesi veya Boolean veri türünden veya en az bir öğenin bir dizi nesnesi olduğu bir tuple'dan bir seçim yapmak mümkündür. Gelişmiş indeksleme her zaman verilerin bir kopyasını döndürür. Buna karşı, dilimleme yalnızca bir görünüm sunar.

İki tür gelişmiş indeksleme vardır - Integer ve Boolean.

Tamsayı İndeksleme

Bu mekanizma, bir dizideki herhangi bir rastgele öğeyi Ndimensional indeksine göre seçmeye yardımcı olur. Her tamsayı dizisi, bu boyuttaki dizinlerin sayısını temsil eder. Dizin, hedef ndarray'in boyutları kadar çok sayıda tamsayı dizisi içerdiğinde, basit hale gelir.

Aşağıdaki örnekte, ndarray nesnesinin her satırından belirtilen sütunun bir öğesi seçilmiştir. Bu nedenle, satır dizini tüm satır numaralarını içerir ve sütun dizini seçilecek öğeyi belirtir.

örnek 1

import numpy as np 

x = np.array([[1, 2], [3, 4], [5, 6]]) 
y = x[[0,1,2], [0,1,0]] 
print y

Çıktısı aşağıdaki gibi olacaktır -

[1  4  5]

Seçim, birinci diziden (0,0), (1,1) ve (2,0) 'deki öğeleri içerir.

Aşağıdaki örnekte, 4X3 dizisinin köşelerine yerleştirilen öğeler seçilmiştir. Seçimin satır indisleri [0, 0] ve [3,3] iken sütun indisleri [0,2] ve [0,2] 'dir.

Örnek 2

import numpy as np 
x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 
   
print 'Our array is:' 
print x 
print '\n' 

rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]]) 
y = x[rows,cols] 
   
print 'The corner elements of this array are:' 
print y

Bu programın çıktısı aşağıdaki gibidir -

Our array is:                                                                 
[[ 0  1  2]                                                                   
 [ 3  4  5]                                                                   
 [ 6  7  8]                                                                   
 [ 9 10 11]]
 
The corner elements of this array are:                                        
[[ 0  2]                                                                      
 [ 9 11]]

Ortaya çıkan seçim, köşe öğelerini içeren bir ndarray nesnesidir.

Gelişmiş ve temel indeksleme, bir dizin dizisi ile bir dilim (:) veya üç nokta (…) kullanılarak birleştirilebilir. Aşağıdaki örnek, satır için dilim ve sütun için gelişmiş dizin kullanır. Sonuç, her ikisi için de dilim kullanıldığında aynıdır. Ancak gelişmiş dizin, kopyalama ile sonuçlanır ve farklı bellek düzenine sahip olabilir.

Örnek 3

import numpy as np 
x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 

print 'Our array is:' 
print x 
print '\n'  

# slicing 
z = x[1:4,1:3] 

print 'After slicing, our array becomes:' 
print z 
print '\n'  

# using advanced index for column 
y = x[1:4,[1,2]] 

print 'Slicing using advanced index for column:' 
print y

Bu programın çıktısı aşağıdaki gibi olacaktır -

Our array is:
[[ 0  1  2] 
 [ 3  4  5] 
 [ 6  7  8]
 [ 9 10 11]]
 
After slicing, our array becomes:
[[ 4  5]
 [ 7  8]
 [10 11]]

Slicing using advanced index for column:
[[ 4  5]
 [ 7  8]
 [10 11]]

Boolean Dizi İndeksleme

Bu tür gelişmiş dizinleme, elde edilen nesnenin karşılaştırma işleçleri gibi Boole işlemlerinin sonucu olduğu durumlarda kullanılır.

örnek 1

Bu örnekte, Boole endekslemesinin bir sonucu olarak 5'ten büyük öğeler döndürülür.

import numpy as np 
x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 

print 'Our array is:' 
print x 
print '\n'  

# Now we will print the items greater than 5 
print 'The items greater than 5 are:' 
print x[x > 5]

Bu programın çıktısı -

Our array is: 
[[ 0  1  2] 
 [ 3  4  5] 
 [ 6  7  8] 
 [ 9 10 11]] 
 
The items greater than 5 are:
[ 6  7  8  9 10 11]

Örnek 2

Bu örnekte, NaN (Sayı Değil) öğeleri ~ (tamamlama operatörü) kullanılarak çıkarılmıştır.

import numpy as np 
a = np.array([np.nan, 1,2,np.nan,3,4,5]) 
print a[~np.isnan(a)]

Çıktısı -

[ 1.   2.   3.   4.   5.]

Örnek 3

Aşağıdaki örnek, karmaşık olmayan öğelerin bir diziden nasıl filtreleneceğini gösterir.

import numpy as np 
a = np.array([1, 2+6j, 5, 3.5+5j]) 
print a[np.iscomplex(a)]

Burada çıktı aşağıdaki gibidir -

[2.0+6.j  3.5+5.j]