NumPy reshape(): Python'da NumPy Dizilerini Yeniden Şekillendirme
Yayınlanan: 2022-04-20Bu öğreticide, orijinal verileri değiştirmeden NumPy dizilerini yeniden şekillendirmek için NumPy reshape() 'nin nasıl kullanılacağını öğreneceksiniz.
Numpy dizileriyle çalışırken, genellikle mevcut bir diziyi farklı boyutlarda bir diziye yeniden şekillendirmek isteyebilirsiniz. Bu, verileri birden çok adımda dönüştürdüğünüzde özellikle yararlı olabilir.
Ve NumPy reshape()
bunu kolayca yapmanıza yardımcı olur. Önümüzdeki birkaç dakika içinde, reshape()
kullanmak için sözdizimini öğrenecek ve dizileri farklı boyutlara yeniden şekillendireceksiniz.
NumPy Dizilerinde Yeniden Şekillendirme Nedir?
NumPy dizileriyle çalışırken, önce 1 boyutlu bir sayı dizisi oluşturmak isteyebilirsiniz. Ardından, istenen boyuta sahip bir diziye yeniden şekillendirin.
Bu, özellikle yeni dizinin boyutları başlangıçta bilinmediğinde veya yürütme sırasında çıkarıldığında yararlıdır. Veya belirli bir veri işleme adımının girdinin belirli bir şekle sahip olmasını gerektirmesi de mümkün olabilir.
Yeniden şekillendirmenin kullanışlı olduğu yer burasıdır.
Örneğin, aşağıdaki çizimi düşünün. Bir vektörümüz var—tek boyutlu 6 elemanlı dizi. Ve onu 2×3, 3×2, 6×1 vb. şekillerde diziler halinde yeniden şekillendirebiliriz.

️ Bu eğitimdeki örnekleri takip etmek için Python ve NumPy'nin kurulu olması gerekir. Henüz NumPy'niz yoksa NumPy kurulum kılavuzumuza bakın.
Şimdi devam edebilir ve NumPy'yi np
takma adı altında import numpy as np
çalıştırarak içe aktarabilirsiniz.
Bir sonraki bölümde sözdizimini öğrenmeye devam edelim.
NumPy reshape() sözdizimi
NumPy reshape() kullanmak için sözdizimi:
np.reshape(arr, newshape, order = 'C'|'F'|'A')
- arr herhangi bir geçerli NumPy dizi nesnesidir. İşte, yeniden şekillendirilecek dizi.
- newshape yeni dizinin şeklidir. Bir tamsayı veya bir demet olabilir.
- newshape bir tamsayı olduğunda, döndürülen dizi tek boyutludur.
- order , yeniden şekillendirilecek dizinin öğelerinde okumak istediğiniz sırayı ifade eder.
- Varsayılan değer 'C'dir; bu, orijinal dizinin öğelerinin C benzeri bir indeksleme sırasında (0 ile başlayarak) okunacağı anlamına gelir.
- 'F' , Fortran benzeri indeksleme (1 ile başlayan) anlamına gelir. Ve 'A' , arr dizisinin bellek düzenine bağlı olarak öğeleri C benzeri veya Fortran benzeri sırayla okur.
Peki
np.reshape()
ne döndürür?Mümkünse orijinal dizinin yeniden şekillendirilmiş bir görünümünü döndürür. Aksi takdirde, dizinin bir kopyasını döndürür.
Yukarıdaki satırda, NumPy reshape()
'nin mümkün olduğunda bir görünüm döndürmeye çalışacağından bahsetmiştik. Aksi takdirde, bir kopyasını döndürür. Bir görünüm ve bir kopya arasındaki farkları tartışmaya devam edelim.
NumPy Dizilerinin Görünümü ve Kopyası
Adından da anlaşılacağı gibi copy , orijinal dizinin bir kopyasıdır. Ve kopyada yapılan herhangi bir değişiklik orijinal diziyi etkilemeyecektir .
Öte yandan görünüm , orijinal dizinin yeniden şekillendirilmiş görünümüne atıfta bulunur. Bu, görünümde yapılan herhangi bir değişikliğin orijinal diziyi de etkileyeceği ve bunun tersi anlamına gelir.
1B Diziyi 2B Dizilere Yeniden Şekillendirmek için NumPy reshape() kullanın
#1. np.arange() kullanarak örnek dizi oluşturarak başlayalım.
1'den 12'ye kadar arr1 adı verilen 12 sayı dizisine ihtiyacımız var. NumPy arange() işlevi varsayılan olarak bitiş noktasını hariç tuttuğundan, durma değerini 13 olarak ayarlayın.
Şimdi yukarıdaki sözdizimini kullanalım ve arr1
12 elemanlı bir 2B şekil dizisine (4,3) yeniden şekillendirelim. Buna 4 satır ve 3 sütunlu arr2
.
import numpy as np arr1 = np.arange(1,13) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr2 = np.reshape(arr1,(4,3)) print("\nReshaped array:") print(arr2)
Orijinal ve yeniden şekillendirilmiş dizilere bir göz atalım.
Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12] Reshaped array: [[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]]
np.reshape()
bağımsız değişkeni olarak iletmek yerine, orijinal dizide.reshape()
yöntemini de çağırabilirsiniz.
dir(arr1)
çalıştırabilirsiniz ve bu, arr1
dizi nesnesinde kullanabileceğiniz tüm olası yöntemleri ve nitelikleri listeleyecektir.
dir(arr1) # Output [ ... ... 'reshape' ... .. ]
Yukarıdaki kod hücresinde, .reshape()
öğesinin mevcut NumPy dizisi arr1
üzerinde kullanmak için geçerli bir yöntem olduğunu görebilirsiniz.
️ Bu nedenle, NumPy dizilerini yeniden şekillendirmek için aşağıdaki basitleştirilmiş sözdizimini de kullanabilirsiniz.
arr.reshape(d0,d1,...,dn) # where: # d0, d1,..,dn are the dimensions of the reshaped array # d0 * d1 * ...* dn = N, the number of elements in arr
Bu öğreticinin geri kalanı için, bu sözdizimini örneklerimizde kullanalım.
#2. 12 elemanlı vektörümüzü 12 x 1 diziye yeniden şekillendirmeyi deneyelim.
import numpy as np arr1 = np.arange(1,13) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr3 = arr1.reshape(12,1) print("\nReshaped array:") print(arr3)
Aşağıdaki çıktıda dizinin gerektiği gibi yeniden şekillendirildiğini görebilirsiniz.
Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12] Reshaped array: [[ 1] [ 2] [ 3] [ 4] [ 5] [ 6] [ 7] [ 8] [ 9] [10] [11] [12]]
Peki, bir kopya mı yoksa bir görünüm mü elde ettiğimizi nasıl kontrol edeceğiz?
Bunu kontrol etmek için döndürülen dizideki base
niteliğini çağırabilirsiniz.
- Dizi bir kopyaysa,
base
nitelikNone
olacaktır. - Dizi bir görünümse,
base
nitelik orijinal dizi olacaktır.
Bunu hızlıca doğrulayalım.

arr3.base # Output array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
Gördüğünüz gibi, arr3
base
özelliği orijinal diziyi döndürür. Bu, orijinal dizinin bir görünümünü aldığımız anlamına gelir.
#3. Şimdi vektörü başka bir geçerli 2 x 6 diziye yeniden şekillendirmeye çalışalım.
import numpy as np arr1 = np.arange(1,13) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr4 = arr1.reshape(2,6) print("\nReshaped array:") print(arr4)
Ve işte çıktı:
Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12] Reshaped array: [[ 1 2 3 4 5 6] [ 7 8 9 10 11 12]]
Bir sonraki bölümde, arr1
bir 3B diziye yeniden şekillendirelim.
1D Diziyi 3D Dizilere Yeniden Şekillendirmek için NumPy reshape() kullanın
arr1
bir 3B diziye yeniden şekillendirmek için istenen boyutları (1, 4, 3) olarak ayarlayalım.
import numpy as np arr1 = np.arange(1,13) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr3D = arr1.reshape(1,4,3) print("\nReshaped array:") print(arr3D)
Şimdi orijinal dizi arr1
ile aynı 12 öğeye sahip bir 3B dizi oluşturduk.
Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12] Reshaped array: [[[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]]]
Yeniden Şekillendirme Sırasında Değer Hataları Nasıl Hata Ayıklanır
Sözdizimini hatırlarsanız, yeniden şekillendirme yalnızca boyutların çarpımı dizideki öğe sayısına eşit olduğunda geçerlidir.
import numpy as np arr1 = np.arange(1,13) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr2D = arr1.reshape(4,4) print("\nReshaped array:") print(arr2D)
Burada, 12 elemanlı bir diziyi 16 elemanlı 4×4 diziye yeniden şekillendirmeye çalışıyorsunuz. Yorumlayıcı, aşağıda görüldüğü gibi bir Değer Hatası verir.
Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12] ----------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-11-63552bcc8c37> in <module>() 6 7 # Reshape array ----> 8 arr2 = arr1.reshape(4,4) 9 print("\nReshaped array:") 10 print(arr2) ValueError: cannot reshape array of size 12 into shape (4,4)
Bu tür hatalardan kaçınmak için, toplam öğe sayısına bağlı olarak boyutlardan birinin şeklini otomatik olarak çıkarmak için -1'i kullanabilirsiniz.
Örneğin, önceden n – 1 boyutları biliyorsanız, yeniden şekillendirilmiş dizide n'inci boyutu çıkarmak için -1'i kullanabilirsiniz.
24 elemanlı bir diziniz varsa ve onu 3B diziye yeniden şekillendirmek istiyorsanız. Diyelim ki 3 satır ve 4 sütuna ihtiyacınız var. Üçüncü boyut boyunca -1 değerini iletebilirsiniz.
import numpy as np arr1 = np.arange(1,25) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr_res = arr1.reshape(4,3,-1) print("\nReshaped array:") print(arr_res) print(f"Shape of arr_res:{arr_res.shape}")
Şekil dizisinin şeklini incelediğinizde, yeniden şekillendirilen dizinin üçüncü boyut boyunca 2 şeklinde olduğunu görebilirsiniz.
Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24] Reshaped array: [[[ 1 2] [ 3 4] [ 5 6]] [[ 7 8] [ 9 10] [11 12]] [[13 14] [15 16] [17 18]] [[19 20] [21 22] [23 24]]] Shape of arr_res:(4, 3, 2)
Bu, bir diziyi düzleştirmede özellikle yararlıdır. Ve bunu bir sonraki bölümde öğreneceksiniz.
Bir Diziyi Düzleştirmek için NumPy reshape() kullanın
N boyutlu dizilerden düzleştirilmiş bir diziye geri dönmeniz gereken zamanlar vardır. Bir görüntüyü uzun bir piksel vektörüne düzleştirmek istediğinizi varsayalım.
Aşağıdaki adımları kullanarak basit bir örnek kodlayalım:
- 0 ila 255 aralığında piksellerle
img_arr
adlı 3 x 3 gri tonlamalı bir görüntü dizisi oluşturun. - Ardından, bu
img_arr
düzleştirin ve düzleştirilmiş diziyi yazdırın,flat_arr
. - Ayrıca, doğrulamak için
img_arr
veflat_arr
şekillerini yazdırın.
img_arr = np.random.randint(0, 255, (3,3)) print(img_arr) print(f"Shape of img_arr: {img_arr.shape}") flat_arr = img_arr.reshape(-1) print(flat_arr) print(f"Shape of flat_arr: {flat_arr.shape}")
İşte çıktı.
[[195 145 77] [ 63 193 223] [215 43 36]] Shape of img_arr: (3, 3) [195 145 77 63 193 223 215 43 36] Shape of flat_arr: (9,)
Yukarıdaki kod hücresinde, flat_arr
9 elemanlı 1B piksel değerleri vektörü olduğunu görebilirsiniz.
Özetliyor
Öğrendiklerimizi hızlıca gözden geçirme zamanı.
- arr'ı newshape içinde belirtilen şekle yeniden şekillendirmek için np.reshape( arr , newshape) kullanın. newshape , yeniden şekillendirilmiş dizinin boyutlarını belirten bir tanımlama grubudur.
- Alternatif olarak, arr'ı d0 x d1 x … x dn şeklinde yeniden şekillendirmek için arr.reshape (d0, d1, …, dn) kullanın.
- Yeniden şekillendirme sırasında Değer Hatalarından kaçınmak için orijinal dizideki öğelerin sayısı olan d0 * d1 * …* dn = N olup olmadığını kontrol edin.
- Boyutun otomatik olarak çıkarılmasını istiyorsanız, yeni şekilde en fazla bir boyut için -1 kullanın.
- Son olarak, diziyi düzleştirmek için arr.reshape(-1) kullanabilirsiniz.
Artık NumPy reshape()'yi nasıl kullanacağınızı bildiğinize göre, NumPy linspace() işlevinin nasıl çalıştığını öğrenin.
Dilerseniz Jupyter not defterindeki kod örneklerini deneyebilirsiniz. Başka geliştirme ortamları arıyorsanız, Jupyter alternatifleriyle ilgili kılavuzumuza göz atın.