NumPy

Основным объектом NumPy является однородный многомерный массив (в numpy называется numpy.ndarray). Это многомерный массив элементов (обычно чисел), одного типа.

Наиболее важные атрибуты объектов ndarray:

$ndarray.ndim$ - число измерений (чаще их называют "оси") массива.

$ndarray.shape$ - размеры массива, его форма. Это кортеж натуральных чисел, показывающий длину массива по каждой оси.

$ndarray.dtype$ - объект, описывающий тип элементов массива.

Создание массива:

$numpy.array()$ - создает массив из обычных списков или кортежей Python

$numpy.zeros()$ - создает массив из нулей, в скобках необходимо указать размер массива.

$numpy.onec()$ - создает массив из едениц, в скобках необходимо указать размер массива.

$numpy.empty()$ - создает пустой массив ( значения массива какой-то мусор), в скобках необходимо указать размер массива.

Примеры

Для начала необходимо подключить пакет NumPy.

In [ ]:
# Можно делать так
import numpy
In [ ]:
numpy.sum(a)
In [2]:
# Так делать не нужно
from numpy import *
In [ ]:
sum(a)
In [3]:
# Так делать удобнее
import numpy as np
In [ ]:
np.sum(a)
np.array
In [42]:
mas_1 = np.array((1, 2, 3))
mas_1
Out[42]:
array([1, 2, 3])
In [69]:
L = [1, 2, 3]
mas_2 = np.array(L)
mas_2
Out[69]:
array([1, 2, 3])
In [16]:
mas_3 = np.array(range(1,4))
mas_3
Out[16]:
array([1, 2, 3])
np.zeros
In [17]:
Z = np.zeros((5,2))
Z
Out[17]:
array([[ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.]])
In [22]:
Z.dtype
Out[22]:
dtype('float64')
np.ones
In [19]:
O = np.ones((2,5))
O
Out[19]:
array([[ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.]])
In [21]:
O.shape
Out[21]:
(2, 5)
np.empty
In [20]:
E = np.empty(5)
E
Out[20]:
array([  0.00000000e+00,   0.00000000e+00,   1.54674219e-75,
         1.15393392e-71,   0.00000000e+00])
In [23]:
E.ndim
Out[23]:
1

Базовые операции над массивами

Математические операции над массивами выполняются поэлементно. Создается новый массив, который заполняется результатами действия оператора. Операнды должны иметь один и тот же размер

In [26]:
print('mas_1: ', mas_1)
print('mas_2: ', mas_2)
mas_1:  [1 2 3]
mas_2:  [1 2 3]
In [44]:
mas_1 == mas_2
Out[44]:
array([ True,  True,  True], dtype=bool)
In [24]:
mas_1 + mas_2
Out[24]:
array([2, 4, 6])
In [27]:
mas_1 - mas_2
Out[27]:
array([0, 0, 0])
In [28]:
mas_1 * mas_2
Out[28]:
array([1, 4, 9])
In [36]:
mas_1**mas_2
Out[36]:
array([ 1,  4, 27])
In [38]:
mas_1 % 3  # При взятии остатка от деления на 0 возвращается 0
Out[38]:
array([1, 2, 0])
In [29]:
mas_1 / (mas_1 - mas_1) 
-c:1: RuntimeWarning: divide by zero encountered in true_divide
Out[29]:
array([ inf,  inf,  inf])

Некоторые функции и методы numpy

In [39]:
np.cos(mas_1) 
Out[39]:
array([ 0.54030231, -0.41614684, -0.9899925 ])
In [41]:
np.sin(np.array([np.pi, 0, -np.pi]))
Out[41]:
array([  1.22464680e-16,   0.00000000e+00,  -1.22464680e-16])
In [45]:
array = np.array([[1, 2, 3],[10, 1, 7]])
array
Out[45]:
array([[ 1,  2,  3],
       [10,  1,  7]])
In [73]:
array.sum()
Out[73]:
24
In [46]:
array.sum(axis = 0)
Out[46]:
array([11,  3, 10])
In [47]:
array.max(axis = 1)
Out[47]:
array([ 3, 10])
In [48]:
array.min()
Out[48]:
1
In [33]:
np.prod(mas_1)
Out[33]:
6
Некоторые функции из линейной алгебры

$np.dot()$ - матричное умножение

In [80]:
A = np.array([[1,2], [1,3]])
B = np.array([[1,1], [1,2]])
np.dot(A, B)
Out[80]:
array([[3, 5],
       [4, 7]])

$np.linalg.det()$ - отпределитель матрицы

In [84]:
np.linalg.det(A)
Out[84]:
1.0

Индексы и срезы

Одномерные массивы осуществляют операции индексирования и срезов очень схожим образом с обычными списками.

In [80]:
array = np.array([[1, 2, 3],[10, 1, 7]])
array
Out[80]:
array([[ 1,  2,  3],
       [10,  1,  7]])
In [55]:
array[0]
Out[55]:
array([1, 2, 3])
In [54]:
array[0, 2]
Out[54]:
3
In [63]:
array[1, -1]
Out[63]:
7
In [58]:
array[1, 1:3]
Out[58]:
array([1, 7])
In [61]:
array > 5
Out[61]:
array([[False, False, False],
       [ True, False,  True]], dtype=bool)
In [75]:
array
Out[75]:
array([[ 1,  2,  3],
       [10,  1,  7]])
In [62]:
array[array > 5]
Out[62]:
array([10,  7])
In [64]:
array[array == 1]
Out[64]:
array([1, 1])

Изменение формы

$ndarray.reshape()$ - возвращает аргумент с измененной формой

$ndarray.resize()$ - изменяет форму массива

$ndarray.ravel()$ - делает массив плоским

$ndarray.transpose()$ - транспонирование

$np.newaxis()$ - добавляет фиктивную ось

In [66]:
array.reshape(6, 1)
Out[66]:
array([[ 1],
       [ 2],
       [ 3],
       [10],
       [ 1],
       [ 7]])
In [67]:
array.shape = (6, 1)
array
Out[67]:
array([[ 1],
       [ 2],
       [ 3],
       [10],
       [ 1],
       [ 7]])
In [69]:
array.resize(2,3)
array
Out[69]:
array([[ 1,  2,  3],
       [10,  1,  7]])
In [65]:
array.ravel()  
Out[65]:
array([ 1,  2,  3, 10,  1,  7])
In [70]:
array.transpose()
Out[70]:
array([[ 1, 10],
       [ 2,  1],
       [ 3,  7]])
In [46]:
array[:,np.newaxis]
Out[46]:
array([[[ 1,  2,  3]],

       [[10,  1,  7]]])
In [76]:
array.shape
Out[76]:
(2, 3)
In [48]:
array[:,np.newaxis].shape
Out[48]:
(2, 1, 3)
In [49]:
array[:, :, np.newaxis].shape
Out[49]:
(2, 3, 1)
In [82]:
a = np.ones((6,3))
b =  np.ones(6)*3
#a+b
a+b[:, np.newaxis]
Out[82]:
array([[ 4.,  4.,  4.],
       [ 4.,  4.,  4.],
       [ 4.,  4.,  4.],
       [ 4.,  4.,  4.],
       [ 4.,  4.,  4.],
       [ 4.,  4.,  4.]])

Копии

При работе с массивами, их данные иногда необходимо копировать в другой массив. Это часто является источником путаницы, так как простое присваивание не создает ни копии массива, ни копии его данных.

In [72]:
new_array = array
In [73]:
new_array[0,0] = -1
new_array
Out[73]:
array([[-1,  2,  3],
       [10,  1,  7]])
In [74]:
array
Out[74]:
array([[-1,  2,  3],
       [10,  1,  7]])

чтобы не сталкиваться с такой проблемой необходимо использовать функцию $np.copy()$

In [86]:
copy_array = np.copy(array)
copy_array
Out[86]:
array([[-1,  2,  3],
       [10,  1,  7]])
In [77]:
copy_array[0,0] = 1
copy_array
Out[77]:
array([[ 1,  2,  3],
       [10,  1,  7]])
In [78]:
array
Out[78]:
array([[-1,  2,  3],
       [10,  1,  7]])
In [ ]:
 

Задачи по numpy на семинаре:

  1. Дан ndarray объект, найти четный максимальный элемент.

  2. Найти максимальный элемент в векторе x среди элементов, после которых стоит нулевой. Для x = np.array([6, 2, 0, 3, 0, 0, 5, 7, 0]) ответ 7.

  3. Реализуйте функцию, которая принимает на вход numpy-массив целых чисел a, и генерирует массив, в котором число i встречается a[i] раз. Обратите внимание на функцию np.repeat

  4. Дан numpy-вектор и действительное число x. Вектор длины n+1 задает полином степени n. Найти производную полинома в точке x. (Например вектор [3, 4, 7] соответствует полиному $3 + 4x + 7x^2$)

In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [52]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]: