Како преобликовати НумПи низове у Питхон-у

У овом водичу ћете научити како да користите НумПи ресхапе() за преобликовање НумПи низова без промене оригиналних података.

Када радите са Нумпи низовима, можда ћете често желети да преобликујете постојећи низ у низ различитих димензија. Ово може бити посебно корисно када трансформишете податке у више корака.

А НумПи ресхапе() вам помаже да то учините лако. У наредних неколико минута научићете синтаксу за коришћење ресхапе(), а такође ћете преобликовати низове у различите димензије.

Шта је преобликовање у НумПи низовима?

Када радите са НумПи низовима, можда ћете прво желети да креирате 1-димензионални низ бројева. А затим га преобликујте у низ са жељеном димензијом.

Ово је посебно корисно када димензије новог низа нису познате у почетку или су закључене током извршавања. Или је такође могуће да одређени корак обраде података захтева да улаз буде одређеног облика.

Ево где преобликовање добро долази.

На пример, размотрите следећу илустрацију. Имамо вектор — једнодимензионални низ од 6 елемената. И можемо га преобликовати у низове облика 2×3, 3×2, 6×1, итд.

▶ Да бисте пратили примере у овом водичу, морате да имате инсталиране Питхон и НумПи. Ако још увек немате НумПи, погледајте наш НумПи водич за инсталацију.

Сада можете да увезете НумПи под псеудонимом нп, тако што ћете покренути: импорт нумпи као нп.

Хајде да наставимо са учењем синтаксе у следећем одељку.

Синтакса НумПи ресхапе()

Ево синтаксе за коришћење НумПи ресхапе():

np.reshape(arr, newshape, order="C"|'F'|'A')
  • арр је било који важећи објекат НумПи низа. Ево, то је низ који треба преобликовати.
  • невсхапе је облик новог низа. То може бити или цео број или тупле.
  • Када је невсхапе цео број, враћени низ је једнодимензионалан.
  • редослед се односи на редослед којим желите да прочитате елементе низа који ће се преобликовати.
  • Подразумевана вредност је ‘Ц’, што значи да ће се елементи оригиналног низа читати у индексном редоследу сличном Ц (почевши са 0)
  • ‘Ф’ означава индексирање слично Фортрану (почиње са 1). А ‘А’ чита елементе у редоследу попут Ц или Фортрана у зависности од распореда меморије низа арр.
  5 бесплатних онлајн алата за генерисање нових логотипа или редизајн икона

Дакле, шта враћа нп.ресхапе()?

Враћа преобликовани приказ оригиналног низа ако је могуће. У супротном, враћа копију низа.

У горњем реду смо споменули да ће НумПи ресхапе() покушати да врати приказ кад год је то могуће. У супротном, враћа копију. Хајде да наставимо да разговарамо о разликама између погледа и копије.

Преглед у односу на копију НумПи низова

Као што име каже, копија је копија оригиналног низа. И све промене направљене на копији неће утицати на оригинални низ.

С друге стране, поглед се једноставно односи на преобликовани приказ оригиналног низа. То значи да ће свака промена направљена у погледу такође утицати на оригинални низ и обрнуто.

Користите НумПи ресхапе() да преобликујете 1Д низ у 2Д низ

#1. Почнимо са креирањем низа узорака користећи нп.аранге().

Потребан нам је низ од 12 бројева, од 1 до 12, који се зове арр1. Пошто функција НумПи аранге() подразумевано искључује крајњу тачку, поставите вредност заустављања на 13.

Сада користимо горњу синтаксу и преобликујемо арр1 са 12 елемената у 2Д низ облика (4,3). Назовимо ово арр2 са 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]]

Уместо да прослеђујете низ као аргумент нп.ресхапе(), такође можете позвати метод .ресхапе() на оригиналном низу.

Можете покренути дир(арр1) и он ће навести све могуће методе и атрибуте које можете користити на објекту низа арр1.

dir(arr1)

# Output 
[
...
...
'reshape'
...
..
]

У горњој ћелији кода можете видети да је .ресхапе() важећи метод за коришћење на постојећем НумПи низу арр1.

▶ Дакле, можете користити и следећу поједностављену синтаксу за преобликовање НумПи низова.

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 к 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]]

❔ Дакле, како да проверимо да ли смо добили копију или преглед?

  13 најбољих безбедносних пракси за заштиту ваше ВордПресс веб локације

Да бисте ово проверили, можете позвати основни атрибут на враћеном низу.

  • Ако је низ копија, основни атрибут ће бити Ништа.
  • Ако је низ поглед, основни атрибут ће бити оригинални низ.

Хајде да ово брзо проверимо.

arr3.base
# Output
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

Као што видите, основни атрибут арр3 враћа оригинални низ. То значи да смо добили приказ оригиналног низа.

#3. Сада, хајде да покушамо да преобликујемо вектор у други важећи низ 2 к 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]]

У следећем одељку, хајде да преобликујемо арр1 у 3Д низ.

Користите НумПи ресхапе() да преобликујете 1Д низ у 3Д низ

Да преобликујемо арр1 у 3Д низ, поставимо жељене димензије на (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)

Сада смо направили 3Д низ са истих 12 елемената као оригинални низ арр1.

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 елемената. Тумач избацује грешку вредности, као што се види испод.

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 да бисте аутоматски закључили облик за једну од димензија—на основу укупног броја елемената.

  Поправите Ц диск се пуни без разлога

На пример, ако унапред знате н – 1 димензију, можете користити -1 да бисте закључили н-ту димензију у преобликованом низу.

Ако имате низ од 24 елемента и желите да га преобликујете у 3Д низ. Претпоставимо да вам требају 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)

Ово је посебно корисно за изравнавање низа. И о томе ћете научити у следећем одељку.

Користите НумПи ресхапе() да изравнате низ

Постоје тренуци када ћете морати да се вратите са Н-димензионалних низова на спљоштени низ. Претпоставимо да желите да изравнате слику у дугачак вектор пиксела.

Хајде да кодирамо једноставан пример користећи следеће кораке:

  • Генеришите низ слика 3 к 3 у сивим тоновима, имг_арр—са пикселима у опсегу од 0 до 255.
  • Затим поравнајте овај имг_арр и одштампајте спљоштени низ, флат_арр.
  • Такође, одштампајте облике имг_арр и флат_арр да бисте проверили.
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,)

У горњој ћелији кода можете видети да је флат_арр 1Д вектор вредности пиксела са 9 елемената.

Сумминг Уп👩‍🏫

Време је да брзо прегледамо оно што смо научили.

  • Користите нп.ресхапе(арр, невсхапе) да преобликујете арр у облик наведен у невсхапе-у. невсхапе је тупле који специфицира димензије преобликованог низа.
  • Алтернативно, користите арр.ресхапе(д0, д1, …, дн) да преобликујете арр да буде облика д0 к д1 к … к дн
  • Проверите да ли је д0 * д1 * …* дн = Н, број елемената у оригиналном низу, да бисте избегли грешке у вредности током преобликовања.
  • Користите -1 за највише једну димензију у новом облику ако желите да се димензија аутоматски закључи.
  • Коначно, можете користити арр.ресхапе(-1) да изравнате низ.

Сада када знате како да користите НумПи ресхапе(), научите како функционише функција НумПи линспаце().

Можете испробати примере кода у Јупитер бележници ако желите. Ако тражите друга развојна окружења, погледајте наш водич о Јупитер алтернативама.