Всіх вітаю! У цій статті ми розберемося, що таке масиви у numpy, як їх види та те, як створювати їх у коді.
Що таке масиви у numpy?
Масиви — це вагома частина бібліотеки numpy, адже саме через масиви і відбувається майже будь-яка робота з числами у цій бібліотеці.
Проте, що насправді таке масиви? Масиви у numpy це спеціальні об’єкт, який може бути різних розмірів та має немало власних методів для використання. Цей об’єкт називається ndarray.
Об’єкт ndarray можна трактувати як n-dimensional array (n-вимірний масив). Тобто масив з якоюсь відповідною розмірністю, від якої залежить кількість індексів для його розкритття при отриманні певних значень з нього.
Наприклад, координати x та y визначають 2-вимірний масив, а координати x, y та z — 3-вимірний масив. У цьому прикладі думайте про індекси як про координати.
По класиці масиви бувають 0-вимірними (0D), 1-вимірними (1D), 2-вимірними (2D) та 3-вимірними (3D), але по суті їх розмірність залежить від кількості інших масивів, які є всередині, а тому масиви можуть бути хоч 8-вимірними (8D), хоч 10-вимірними (10D).
Не хвилюйтеся, якщо на цьому моменті це здалося дещо складним. Далі ми розберемо їх на практиці і все стане зрозуміло.
Робота з 0-вимірним масивом
Створення 0-вимірного масиву
Це найпростіший масив, адже він має у собі всього один елемент. Тобто він не має у собі жодних рядків чи стовпців, а тому він називається 0-вимірним.
Ось приклад створення такого масиву:
zero_d_array = np.array(15)
print(zero_d_array)Резульат:
15Тобто у даному випадку це просто одне число 15, але по факту це є масивом і відноситься до об’єкту ndarray.
Робота з 1-вимірним масивом
Створення 1-вимірного масиву
Одновимірний масив відрізняється від попередного тим, що містить у собі лише один рядок, завдяки якому він і називається одновимірним.
Тобто у цього масиву немає колонок взагалі — є лише одни рядок.
Приклад:
one_d_array = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
print(one_d_array)Результат:
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]Тобто ми просто передали список значень у функцію array() і отримали на виході отакий одновимірний масив. Так як ми передали цей список функції array(), то він більше не вважєаться списком — тепер він є масивом.
Беремо значення з 1-вимірного масиву
Для отримання значення з 1-вимірного масиву нам потрібно ввести лише один індекс:
one_d_array = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
print(one_d_array[4])Отримємо четвертий елемент одновииірного масиву:
5Тут все просто, далі буде складніше.
Робота з 2-вимірним масивом
Створення 2-вимірного масиву
Двовимірний масив включає в себе два рядки, а з них з’являються і колонки. Так як цей масив керується тільки двома осями (x, y), то він називається двовимірним. По суті цей масив містить два одновимірні масиви.
Тут можна навести пряму аналогію із двовимірним простором. Цей простір також передбачає існування лише двох осей x та y. Тільки якщо у двовимірному просторі цеі вісі мають свій фізичний сенс, то тут ми просто маємо два масиви всередині іншого.
Приклад:
two_d_array = np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 15, 16, 17, 18]
])
print(two_d_array)Результати:
[[ 1 2 3 4 5 6 7 8 9]
[10 11 12 13 14 15 16 17 18]]Як бачимо, все працює добре. Але давайте спробуємо зробити другий масив більшим і запустимо код знову.
Додамо ще два елементи у другий масив:
two_d_array = np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
])
print(two_d_array)Тоді отримаємо таку помилку:
ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (2,) + inhomogeneous part.Ця помилка сигналізує нам про те, що один масив містить більшу кількість значень, ніж інший. Справа у тому, що кожен вкладний масив (той масив, що знаходиться всередині іншого) повинен мати однаковий розмір (тобто кількість значень).
Якщо ж ми видалимо елементи 19 та 20 із другого вкладеного масиву, то код знову буде праюцвати без помилок.
Беремо значення з 2-вимірного масиву
Взяти значення з цього масиву ми можемо, знаючи те, що перше значення відповідає за номер рядка (по суті номер масиву), а другий — за номер колонки.
Тоді, щоб взяти будь-які дані з такого масиву, треба записати номер рядка та колонки, де знаходиться певне значення. Також треба пам’ятати те, що номери рядків та колонок починається з нуля.
Ось як це виглядає у коді:
two_d_array = np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 15, 16, 17, 18]
])
print(two_d_array[1, 3])Перший індекс (1) означав другий одновимірний масив:
[10, 11, 12, 13, 14, 15, 16, 17, 18]Другий індекс (3) означав 3 елемент у одновимірному масиві:
13Саме число 13 в якості елементу знаходиться у третій колонці другого рядка (масиву).
Робота 3-вимірним масивом
Створення 3-вимірного масиву
З трьохвимірним масивом ситуація така ж сама, що й з двовимірним. Цей масив керується трьома осями x, y та z, а тому він є тривимірним.
По суті цей масив містить два двовимірні масиви, якщо уважно поглянути на його структуру.
І знову-таки, прямою аналогією для цього цього масиву є трьохвимірний простір, який має три осі (x, y, z), так само як цей масив має три вкладених масива.
Приклад:
three_d_array = np.array([
[
[1, 2, 3],
[4, 5, 6]
],
[
[7, 8, 9],
[10, 11, 12]
]
])
print(three_d_array)Результат:
[[[ 1 2 3]
[ 4 5 6]]
[[ 7 8 9]
[10 11 12]]]Беремо значення з 3-вимірного масиву
Тут все майже так само, як і в двовимірному, але додається ще одне значення через збільшену кількість масивів.
Щоб взяти значення з такого масиву, нам потрібно вказати одразу три значення у квадратних дужках. Так ми поступово розкриємо масив.
Ось приклад:
three_d_array = np.array([
[
[1, 2, 3],
[4, 5, 6]
],
[
[7, 8, 9],
[10, 11, 12]
]
])
print(three_d_array[1, 0, 1])Результат:
8У цьому випадку перший індекс (1) означав другий двовимірний масив:
[[7, 8, 9], [10, 11, 12]]Другий індекс (0) означав перший одновимірний масив, який знаходиться у двовимірному:
[7, 8, 9]Третій індекс (1) означав другий елемент у цьому масиві (яким є 8):
8Робота із власним масивом
Створення 5-вимірного масиву
Перед зкінченням статті пропоную розглянути останній приклад, де створимо масив із власною розмірністю.
Наприклад, нехай це буде 5-вимірний масив:
five_d_array = np.array([
[
[
[[10, 20], [30, 40]]
],
[
[[50, 60], [70, 80]]
]
],
[
[
[[110, 120], [130, 140]]
],
[
[[160, 170], [180, 190]]
]
]
])
print(five_d_array[1, 1, 0, 1, 1])Результат:
190Беремо значення з 5-вимірного масиву
Перед розбором варто відзначити структуру масиву. Він складається з двох 4-вимірних масивів, які у свою чергу складаються з двох 3-вимірних масивів, далі ці 3-вимірні масиви містять у собі по одному 2-вимірному масиву.
Тепер розберемо кожен індекс, який ми вказали для отримання цього елемента.
Перший індекс (1) відповідає за другий 4-вимірний масив:
[
[
[[110, 120], [130, 140]]
],
[
[[160, 170], [180, 190]]
]
]Другий індекс (1) відповідає за другий 3-вимірний масив:
[
[[160, 170], [180, 190]]
]Третій індекс (0) відповідає за двовимірний масив (він тут лише один):
[
[160, 170],
[180, 190]
]Четвертий індекс (1) відповідає за другий 1-вимірний масив:
[180, 190]П’ятий індекс (1) відповідає за другий елемент (тобто 190):
190Ось таким чином ми взяли 190.
Висновок
У цій статті ми розглянули сутність масивів у numpy та навчилися створювати масиви різної розмірності.
Всім дякую за увагу!