В този урок ще научите как да използвате NumPy reshape() за преоформяне на NumPy масиви, без да променяте оригиналните данни.
Когато работите с масиви Numpy, често може да искате да преоформите съществуващ масив в масив с различни измерения. Това може да бъде особено полезно, когато преобразувате данни в множество стъпки.
А NumPy reshape() ви помага да го направите лесно. През следващите няколко минути ще научите синтаксиса за използване на reshape(), както и за преоформяне на масиви в различни измерения.
Съдържание
Какво е преоформяне в NumPy масиви?
Когато работите с масиви NumPy, може първо да искате да създадете едномерен масив от числа. И след това го преоформете в масив с желаното измерение.
Това е особено полезно, когато размерите на новия масив не са известни първоначално или са изведени по време на изпълнение. Или също така може да е възможно определена стъпка на обработка на данни да изисква входът да бъде със специфична форма.
Ето къде преоформянето е полезно.
Например разгледайте следната илюстрация. Имаме вектор – едномерен масив от 6 елемента. И можем да го преформатираме в масиви от форми 2×3, 3×2, 6×1 и т.н.
▶️ За да следвате примерите в този урок, трябва да имате инсталирани Python и NumPy. Ако все още нямате NumPy, вижте нашето ръководство за инсталиране на NumPy.
Сега можете да продължите и да импортирате NumPy под псевдонима np, като изпълните: import numpy as np.
Нека продължим да изучаваме синтаксиса в следващия раздел.
Синтаксис на NumPy reshape()
Ето синтаксиса за използване на NumPy reshape():
np.reshape(arr, newshape, order="C"|'F'|'A')
- arr е всеки валиден обект от масив NumPy. Тук това е масивът, който трябва да бъде преоформен.
- newshape е формата на новия масив. Може да бъде цяло число или кортеж.
- Когато newshape е цяло число, върнатият масив е едномерен.
- редът се отнася до реда, в който искате да прочетете елементите на масива, който трябва да бъде преоформен.
- Стойността по подразбиране е „C“, което означава, че елементите на оригиналния масив ще бъдат прочетени в подобен на C ред на индексиране (започвайки с 0)
- „F“ означава подобно на Fortran индексиране (започващо с 1). И ‘A’ чете елементите в C-подобен или Fortran-подобен ред в зависимост от оформлението на паметта на масива arr.
И така, какво връща np.reshape()?
Връща преоформен изглед на оригиналния масив, ако е възможно. В противен случай връща копие на масива.
В горния ред споменахме, че NumPy reshape() ще се опита да върне изглед, когато е възможно. В противен случай връща копие. Нека продължим да обсъждаме разликите между изглед и копие.
Изглед спрямо копие на масиви NumPy
Както подсказва името, копието е копие на оригиналния масив. И всички промени, направени в копието, няма да засегнат оригиналния масив.
От друга страна, изгледът просто се отнася до преоформения изглед на оригиналния масив. Това означава, че всяка промяна, направена в изгледа, също ще засегне оригиналния масив и обратно.
Използвайте NumPy reshape(), за да преоформите 1D масив в 2D масиви
#1. Нека започнем със създаването на примерния масив с помощта на np.arange().
Нуждаем се от масив от 12 числа, от 1 до 12, наречен arr1. Тъй като функцията NumPy arange() изключва крайната точка по подразбиране, задайте стойността на стоп на 13.
Сега нека използваме горния синтаксис и преоформим arr1 с 12 елемента в 2D масив с форма (4,3). Нека наречем това arr2 с 4 реда и 3 колони.
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)
Нека да разгледаме оригиналните и преоформените масиви.
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(), можете също да извикате метода .reshape() на оригиналния масив.
Можете да изпълните dir(arr1) и той ще изброи всички възможни методи и атрибути, които можете да използвате в масива обект arr1.
dir(arr1) # Output [ ... ... 'reshape' ... .. ]
В горната кодова клетка можете да видите, че .reshape() е валиден метод за използване в съществуващия масив NumPy arr1.
▶️ И така, можете също да използвате следния опростен синтаксис, за да преформатирате масиви NumPy.
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
За останалата част от този урок нека използваме този синтаксис в нашите примери.
#2. Нека опитаме да преоформим нашия 12-елементен вектор в масив 12 x 1.
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)
В резултата по-долу можете да видите, че масивът е преоформен според нуждите.
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]]
❔ И така, как да проверим дали сме получили копие или преглед?
За да проверите това, можете да извикате базовия атрибут на върнатия масив.
- Ако масивът е копие, основният атрибут ще бъде None.
- Ако масивът е изглед, основният атрибут ще бъде оригиналният масив.
Нека бързо проверим това.
arr3.base # Output array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
Както можете да видите, базовият атрибут на arr3 връща оригиналния масив. Това означава, че сме получили изглед на оригиналния масив.
#3. Сега нека се опитаме да преформатираме вектора в друг валиден масив 2 x 6.
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)
И ето изхода:
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]]
В следващия раздел нека преоформим arr1 в 3D масив.
Използвайте NumPy reshape(), за да преоформите 1D масив в 3D масиви
За да променим формата на arr1 в 3D масив, нека зададем желаните размери на (1, 4, 3).
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)
Сега създадохме 3D масив със същите 12 елемента като оригиналния масив arr1.
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]]]
Как да отстранявате грешки в стойността по време на преоформяне
Ако си спомняте синтаксиса, преоформянето е валидно само когато произведението на размерите е равно на броя на елементите в масива.
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)
Тук се опитвате да промените формата на масив от 12 елемента в масив 4×4 с 16 елемента. Интерпретаторът извежда Value Error, както се вижда по-долу.
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)
За да избегнете такива грешки, можете да използвате -1 за автоматично извеждане на формата за едно от измеренията – въз основа на общия брой елементи.
Например, ако знаете n – 1 измерения предварително, можете да използвате -1, за да направите извод за n-тото измерение в преоформения масив.
Ако имате масив от 24 елемента и бихте искали да го преформатирате в 3D масив. Да предположим, че имате нужда от 3 реда и 4 колони. Можете да предадете стойността на -1 по третото измерение.
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}")
Когато изследвате формата на масива от форми, можете да видите, че преоформеният масив има форма 2 по третото измерение.
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)
Това е особено полезно при изравняване на масив. И ще научите за това в следващия раздел.
Използвайте NumPy reshape(), за да изравните масив
Има моменти, когато трябва да се върнете от N-измерни масиви към сплескан масив. Да предположим, че искате да изравните изображение в дълъг вектор от пиксели.
Нека кодираме прост пример, като използваме следните стъпки:
- Генерирайте масив от изображения в нива на сивото 3 x 3, img_arr—с пиксели в диапазона от 0 до 255.
- След това изравнете този img_arr и отпечатайте изравнения масив, flat_arr.
- Освен това отпечатайте формите на img_arr и flat_arr, за да проверите.
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}")
Ето изхода.
[[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,)
В горната кодова клетка можете да видите, че flat_arr е 1D вектор от стойности на пиксели с 9 елемента.
Обобщаване👩🏫
Време е бързо да прегледаме наученото.
- Използвайте np.reshape(arr, newshape), за да преоформите arr във формата, посочена в newshape. newshape е кортеж, указващ размерите на преоформения масив.
- Като алтернатива използвайте arr.reshape(d0, d1, …, dn), за да преоформите arr да бъде с форма d0 x d1 x … x dn
- Проверете дали d0 * d1 * …* dn = N, броят на елементите в оригиналния масив, за да избегнете грешки в стойността по време на преоформяне.
- Използвайте -1 за най-много едно измерение в новата форма, ако искате измерението да бъде изведено автоматично.
- И накрая, можете да използвате arr.reshape(-1), за да изравните масива.
След като вече знаете как да използвате NumPy reshape(), научете как работи функцията NumPy linspace().
Можете да изпробвате примерите за кодове в бележника на Jupyter, ако желаете. Ако търсите други среди за разработка, вижте нашето ръководство за алтернативите на Jupyter.