Как да преоформите NumPy масиви в Python

В този урок ще научите как да използвате 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

За останалата част от този урок нека използваме този синтаксис в нашите примери.

  Как да деинсталирате Boxbe

#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 за автоматично извеждане на формата за едно от измеренията – въз основа на общия брой елементи.

  Как да накарате мобилните отметки на Chrome да се показват на работния плот на Chrome

Например, ако знаете 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.