Python’da atama işlemi yapılan aktarım referans türündendir. Yani, değişkenin gösterdiği bellek adresi aktarılır ve her iki değişken aynı pozisyonu işaret eder. Bir değişkende olan değişiklikten diğer değişkende etkilenir. Bu duruma çözüm olarak view ve copy kullanılabilir. Öncelikle sorunumuzu görelim.
1 2 3 4 5 6 7 8 9 10 11 |
a = np.arange(12) print(id(a)) print("a ",a) b = a print(id(b)) print("b ",a) b.shape = 3,4 #b'nin shape 3x4'lük matrise çevrildi. print(id(a)) print("a ",a) print(id(b)) print("b ",b) |
1 2 3 4 5 6 7 8 9 10 11 12 |
2912184042960 a [ 0 1 2 3 4 5 6 7 8 9 10 11] 2912184042960 b [ 0 1 2 3 4 5 6 7 8 9 10 11] 2912184042960 a [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] 2912184042960 b [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] |
b üzerinde yapılan shape değişikliğinde a’da etkilenmiştir. Çünkü ikisi de aynı bellek bölgesini kullanır. (id komutu bellek adreslerini gösterir.)
04.01. View
Farklı array nesneleri benzer veriyi paylaşabilir. View metodu yeni bir nesne yaratır fakat aynı veri değerlerini bellek adresi olarak tutar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
a = np.arange(12) c = a.view() print("id a", id(a)) print("id c", id(c)) print("id a[0]", id(a[0])) print("id c[0]", id(c[0])) print("a", a) print("c", c) c[0] = 10 print("Değişiklikten sonra") print("a", a) print("c", c) print("Ekleme yapma") c = np.append(c,2) print("a", a) print("c", c) |
1 2 3 4 5 6 7 8 9 10 11 12 |
id a 2912184046896 id c 2912184046496 id a[0] 2912183976944 id c[0] 2912183976944 a [ 0 1 2 3 4 5 6 7 8 9 10 11] c [ 0 1 2 3 4 5 6 7 8 9 10 11] Değişiklikten sonra a [10 1 2 3 4 5 6 7 8 9 10 11] c [10 1 2 3 4 5 6 7 8 9 10 11] Ekleme yapma a [10 1 2 3 4 5 6 7 8 9 10 11] c [10 1 2 3 4 5 6 7 8 9 10 11 2] |
a ve c değişkenleri farklı adresleri göstermesine rağmen a[0] ve c[0] aynı adresleri gösterir. c üzerindeki bir değişiklikten a etkilenir. Ancak, c üzerine yapılan yeni bir ekleme işleminde a etkilenmez.
04.02. Copy
Bu metot hem array hem de içindeki öğeleri kopyalar. Bu sayede her iki değişken birbirinden hiç etkilenmez.
1 2 3 4 5 |
d = a.copy() print("id a", id(a)) print("id d", id(d)) print("a", a) print("d", d) |
1 2 3 4 |
id a 2912184048176 id d 2912184126400 a [10 1 2 3 4 5 6 7 8 9 10 11] d [10 1 2 3 4 5 6 7 8 9 10 11] |
Şimdi güncelleme yapalım.
1 2 3 4 |
d[2] = 908 #güncelleme sonrası print("Güncelleme sonrası") print("a", a) print("d", d) |
1 2 3 |
Güncelleme sonrası a [10 1 2 3 4 5 6 7 8 9 10 11] d [ 10 1 908 3 4 5 6 7 8 9 10 11] |
Görüldüğü gibi iki yapı birbirinden etkilenmedi.
04.03. Fonksiyon ve metotlar
Numpy bize birçok fonksiyon ve metot sunar. Şu ana kadar bazılarını gördük. Bu bölümde kategorik olarak bu fonksiyon ve metotların isimlerine ayırdık. Daha fazla bilgiyi tıklayarak elde edebilirsiniz.
- Array Yaratma
arange
,array
,copy
,empty
,empty_like
,eye
,fromfile
,fromfunction
,identity
,linspace
,logspace
,mgrid
,ogrid
,ones
,ones_like
, r,zeros
,zeros_like
- Dönüşümler
ndarray.astype
,atleast_1d
,atleast_2d
,atleast_3d
,mat
- İşlemler
array_split
,column_stack
,concatenate
,diagonal
,dsplit
,dstack
,hsplit
,hstack
,ndarray.item
,newaxis
,ravel
,repeat
,reshape
,resize
,squeeze
,swapaxes
,take
,transpose
,vsplit
,vstack
- Sorular
all
,any
,nonzero
,where
- Sıralama
argmax
,argmin
,argsort
,max
,min
,ptp
,searchsorted
,sort
- Operasyonlar
choose
,compress
,cumprod
,cumsum
,inner
,ndarray.fill
,imag
,prod
,put
,putmask
,real
,sum
- Temel istatistik
cov
,mean
,std
,var
- Temel lineer cebir
cross
,dot
,outer
,linalg.svd
,vdot