Python Numpy

Вступ

NumPy це open-source модуль для python, який надає загальні математичні та числові операції у вигляді пре-компільованих, швидких функцій. Вони поєднуються у високорівневі пакети. Вони забезпечують функціонал, який можна порівняти із функціоналом MatLab. NumPy (Numeric Python) надає базові методи для маніпуляції з великими масивами та матрицями. SciPy (Scientific Python) розширює функціонал numpy величезною колекцією корисних алгоритмів, таких як мінімізація, перетворення Фур’є, регресія та інші прикладні математичні техніки.

Встановлення

Якщо у вас є Python(x, y) (Примітка перекладача: Python(x, y), це дистрибутив вільного наукового та інженерного програмного забезпечення для чисельних розрахунків, аналізу та візуалізації даних на основі мови програмування Python та великої кількості модулів (бібліотек)) на платформі Windows, ви готові починати. Якщо ж ні, то після встановлення python вам потрібно встановити пакети самостійно, спочатку NumPy потім SciPy. Установка доступна тут . Виконуйте встановлення на сторінці, там все гранично зрозуміло.

Небагато додаткової інформації

Спільнота NumPy та SciPy підтримує онлайн-посібники, які включають гайди та туторіали тут: docs.scipy.org/doc . Імпорт модуля numpy Є кілька шляхів імпорту. Стандартний метод це використовувати простий вираз:

import numpy

Тим не менш, для великої кількості викликів функцій numpy, стає нудно писати numpy.X знову і знову. Натомість набагато легше зробити це так:

import numpy as np

Цей вираз дозволяє нам отримувати доступ до numpy об’єктів, використовуючи np.X замість numpy.X. Також можна імпортувати numpy прямо у використовуваний простір імен, щоб взагалі не використовувати функції через точку, а викликати їх безпосередньо:

from numpy import *

Однак, цей варіант не вітається в програмуванні на python, тому що видаляє деякі корисні структури, які модуль надає. До кінця цього туторіалу будемо використовувати другий варіант імпорту (import numpy as np).

Масиви

Головною особливістю numpy є об’єкт array. Масиви схожі зі списками в python, крім того, що елементи масиву повинні мати однаковий тип даних, як float і int. З масивами можна проводити числові операції з більшим обсягом інформації в рази швидше і, головне, набагато ефективніше, ніж зі списками. Створення масиву зі списку:

a = np.array([1, 4, 5, 8], float)
>>> a
array([ 1.,  4.,  5.,  8.])
>>> type(a)
<class 'numpy.ndarray'>

Тут функція array приймає два аргументи: список для конвертації в масив і тип кожного елемента. До всіх елементів можна отримати доступ і маніпулювати ними так само, як ви б це робили зі звичайними списками:

>>> a[:2]
array([ 1.,  4.])
>>> a[3]
8.0
>>> a[0] = 5.
>>> a
array([ 5.,  4.,  5.,  8.])

Масиви можуть бути багатовимірними. На відміну від списків можна використовувати коми в дужках. Ось приклад двовимірного масиву (матриця):

>>> a = np.array([[1, 2, 3], [4, 5, 6]], float)
>>> a
array([[ 1.,  2.,  3.],
[ 4.,  5.,  6.]])
>>> a[0,0]
1.0
>>> a[0,1]
2.0

Array slicing працює з багатовимірними масивами аналогічно, як і з одномірними, застосовуючи кожен зріз як фільтр для встановленого вимірювання. Використовуйте “:” у вимірі для вказівки використання всіх елементів цього виміру:

>>> a = np.array([[1, 2, 3], [4, 5, 6]], float)
>>> a[1,:]
array([ 4.,  5.,  6.])
>>> a[:,2]
array([ 3.,  6.])
>>> a[-1:, -2:]
array([[ 5.,  6.]])

Метод shape повертає кількість рядків та стовпців у матриці:

>>> a.shape
(2, 3)

Метод dtype повертає тип змінних, що зберігаються в масиві:

>>> a.dtype
dtype('float64')

Тут float64, це числовий тип даних у numpy, який використовується для зберігання речових чисел подвійної точності. Так само як float у Python. Метод len повертає довжину першого виміру (осі):

a = np.array([[1, 2, 3], [4, 5, 6]], float)
>>> len(a)
2

Метод in використовується для перевірки на наявність елемента в масиві:

>>> a = np.array([[1, 2, 3], [4, 5, 6]], float)
>>> 2 in a
True
>>> 0 in a
False

Масиви можна переформувати за допомогою методу, який задає новий багатовимірний масив. Наслідуючи такий приклад, ми переформатуємо одновимірний масив з десяти елементів у двовимірний масив, що складається з п’яти рядків і двох стовпців:

>>> a = np.array(range(10), float)
>>> a
array([ 0.,  1.,  2., 3.,  4.,  5.,  6.,  7.,  8.,  9.])
>>> a = a.reshape((5, 2))
>>> a
array([[ 0.,  1.],
[ 2.,  3.],
[ 4.,  5.],
[ 6.,  7.],
[ 8.,  9.]])
>>> a.shape
(5, 2)

Зверніть увагу, що метод reshape створює новий масив, а не модифікує оригінальний. Майте на увазі, зв’язування імен у python працює і з масивами. Метод Copy використовується для створення копії існуючого масиву в пам’яті:

>>> a = np.array([1, 2, 3], float)
>>> b = a
>>> c =  a.copy()
>>> a[0] = 0
>>> a
array([0., 2., 3.])
>>> b
array([0., 2., 3.])
>>> c
array([1., 2., 3.])

Списки також можна створювати з масивів:

>>> a = np.array([1, 2, 3], float)
>>> a.tolist()
[1.0, 2.0, 3.0]
>>> list(a)
[1.0, 2.0, 3.0]

Можна також переконвертувати масив у бінарний рядок (тобто не human-readable форму). Використовуйте метод tostring для цього. Метод відstring працює для зворотного перетворення. Ці операції іноді корисні для збереження великої кількості даних у файлах, які можуть бути зчитані у майбутньому.

>>> a = array([1, 2, 3], float)
>>> s = a.tostring()
>>> s
'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x08@'
>>> np.fromstring(s)
array([ 1.,  2.,  3.])

Заповнення масиву є однаковим значенням.

>>> a = array([1, 2, 3], float)
>>> a
array([ 1.,  2.,  3.])
>>> a.fill(0)
>>> a
array([ 0.,  0.,  0.])

Транспонування масивів також можливе, при цьому створюється новий масив:

>>> a = np.array(range(6), float).reshape((2, 3))
>>> a
array([[ 0.,  1.,  2.],
[ 3.,  4.,  5.]])
>>> a.transpose()
array([[ 0.,  3.],
[ 1.,  4.],
[ 2.,  5.]])

Багатовимірний масив можна переконвертувати на одномірний за допомогою методу flatten:

>>> a = np.array([[1, 2, 3], [4, 5, 6]], float)
>>> a
array([[ 1.,  2.,  3.],
[ 4.,  5.,  6.]])
>>> a.flatten()
array([ 1.,  2.,  3.,  4.,  5.,  6.])

Два або більше масивів можна сконкатенувати за допомогою методу concatenate:

>>> a = np.array([1,2], float)
>>> b = np.array([3,4,5,6], float)
>>> c = np.array([7,8,9], float)
>>> np.concatenate((a, b, c))
array([1., 2., 3., 4., 5., 6., 7., 8., 9.])

Якщо масив не одномірний, можна задати вісь, якою буде відбуватися з’єднання. За умовчанням (не задаючи значення осі), з’єднання відбуватиметься за першим виміром:

>>> a = np.array([[1, 2], [3, 4]], float)
>>> b = np.array([[5, 6], [7,8]], float)
>>> np.concatenate((a,b))
array([[ 1.,  2.],
[ 3.,  4.],
[ 5.,  6.],
[ 7.,  8.]])
>>> np.concatenate((a,b), axis=0)
array([[ 1.,  2.],
[ 3.,  4.],
[ 5.,  6.],
[ 7.,  8.]])
>>>
np.concatenate((a,b), axis=1)
array([[ 1.,  2.,  5.,  6.],
[ 3.,  4.,  7.,  8.]])

На закінчення, розмірність масиву може бути збільшена при використанні константи newaxis у квадратних дужках:

>>> a = np.array([1, 2, 3], float)
>>> a
array([1., 2., 3.])
>>> a[:,np.newaxis]
array([[ 1.],
[ 2.],
[ 3.]])
>>> a[:,np.newaxis].shape
(3,1)
>>> b[np.newaxis,:]
array([[ 1.,  2.,  3.]])
>>> b[np.newaxis,:].shape
(1,3)

Зауважте, тут кожен масив двовимірний; створений за допомогою newaxis має розмірність один. Метод newaxis підходить для зручного створення належно-мірних масивів у векторній та матричній математиці.

Далі буде ;)