Numpy

Installation

Для установки нужно перейти по ссылке: http://www.scipy.org/Download

Arrays

Arrays похожи на списки в Python, но в отличии от Python, Arrays - гомогенная структура, то есть может содержать только объекты одного типа, например, числа (float, int, ...)

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

Далее пример создания массива в numpy

In [1]:
import numpy as np


a = np.array([1, 4, 5, 8], float)
a
Out[1]:
array([ 1.,  4.,  5.,  8.])

С массивами можно делать все те же операции, что и со стандартными списками.

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

Массивы могут быть многомерными. В отличии от списков, обращение по индексу выполняется несколько иным образом.

In [3]:
a = np.array([[1, 2, 3], [4, 5, 6]], float)
print(a[0,0])
a
1.0
Out[3]:
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])

Свойтсво shape массива возвращает tuple, элементы которого есть размер каждого из измерений.

In [4]:
a.shape
Out[4]:
(2, 3)
In [5]:
print(a.dtype)
float64

Выражение in может быть изпользовано для проверки принадлежности элемента массиву.

In [6]:
2 in a
Out[6]:
True

Массивы могут быть reshaped. В представленном ниже примере одномерный массив, состоящий из 10 элементов, преобразуется в двумерный массив.

In [7]:
a = np.array(range(10), int)
a
Out[7]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [8]:
a = a.reshape((5, 2))
a
Out[8]:
array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7],
       [8, 9]])
In [9]:
a.transpose()
Out[9]:
array([[0, 2, 4, 6, 8],
       [1, 3, 5, 7, 9]])
In [10]:
a.flatten()
Out[10]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

Можно выполнять конкатенацию массивов как одномерных так и многомерных

In [11]:
a = np.array([[1, 2], [3, 4]], float)
b = np.array([[5, 6], [7,8]], float)

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

Но есть и другой способ с использованием методов vstack и hstack.

{Python}
x = np.arange(0,10,2)                     # x=([0,2,4,6,8])
y = np.arange(5)                          # y=([0,1,2,3,4])
m = np.vstack([x,y])                      # m=([[0,2,4,6,8],
                                          #     [0,1,2,3,4]])
xy = np.hstack([x,y])                     # xy =([0,2,4,6,8,0,1,2,3,4])

Глубокое копирование массивов

In [12]:
a = np.array([1, 2, 3], int)
b = a
c = a.copy()
a[0] = 4
print(a, b, c)
[4 2 3] [4 2 3] [1 2 3]

Другие способы создания массивов

In [13]:
print(np.arange(5, dtype=float))
print(np.arange(1, 6, 2, dtype=int))
print(np.ones((2,3), dtype=float))

a = np.array([[1, 2, 3], [4, 5, 6]], float)
print(np.zeros_like(a)) # ones_like
[ 0.  1.  2.  3.  4.]
[1 3 5]
[[ 1.  1.  1.]
 [ 1.  1.  1.]]
[[ 0.  0.  0.]
 [ 0.  0.  0.]]

В Numpy есть методы, которые позволяют создавать матрицы определенного вида, например, единичную матрицу.

In [14]:
np.identity(4, dtype=int)
Out[14]:
array([[1, 0, 0, 0],
       [0, 1, 0, 0],
       [0, 0, 1, 0],
       [0, 0, 0, 1]])
In [15]:
np.eye(4, k=1, dtype=float)
Out[15]:
array([[ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.]])

Array mathematics

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

In [16]:
a = np.array([1,2,3], float)
b = np.array([5,2,6], float)
a + b
Out[16]:
array([ 6.,  4.,  9.])

Для двумерных массивов операция умножения также выполняется поэлементно и не имеет отношения к оперции умножения матриц, которую мы рассмотрим чуть позже.

Кроме возможности выполнения стандартных арифметических операций, Numpy предоставляет большое количество математических функций, которые могут быть поэлементно применены к массивам. Среди них множно найти, например: abs, sign, sqrt, log, log10, exp, sin, cos, tan, arcsin, arccos, arctan, sinh, cosh, tanh, arcsinh, arccosh, and arctanh.

In [17]:
a = np.array([1, 4, 9], float)
np.sqrt(a)
Out[17]:
array([ 1.,  2.,  3.])

Array iteration

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

In [18]:
a = np.array([1, 4, 5], int)
for x in a:
    print(x)
1
4
5

Для случая многомерных массивов, итерирование происходит по первому измерению.

Basic array operations

Существует большое количество функций, которые позволяют выполнять агрегацию значений всего массива, например: sum, prod, min, max, mean, argmin, argmax.

Для многомерных массивов, функции описанные выше, в качестве аргумента можно указать то по какому измерению будет выполняться операция.

In [19]:
a = np.array([1,2,4], int)
print(a.sum(), a.prod()) # np.sum(a), np.prod(a)
7 8

Так же как и обычные списки, массивы можно сортировать, искать уникальные элементы.

In [20]:
a = np.array([6, 2, 5, -1, 0, 5, 2], float)
a.sort()
print(a)
print(np.unique(a))
[-1.  0.  2.  2.  5.  5.  6.]
[-1.  0.  2.  5.  6.]

Vector and matrix mathematics

Numpy предоставляет большое количество функций для выполнения стандартных векторно-матричных преобразований. В частности, для того чтобы выолнить скалярное произведение, можно воспользоваться функцией dot, которая в случае двумерных массивов имеет смысл матричного произведения.

In [21]:
a = np.array([1, 2, 3], float)
b = np.array([0, 1, 1], float)
np.dot(a, b)
Out[21]:
5.0
In [22]:
a = np.array([[0, 1], [2, 3]], float)
b = np.array([[1, 1], [4, 0]], float)
np.dot(a, b)
Out[22]:
array([[  4.,   0.],
       [ 14.,   2.]])

Classes

In [23]:
class Counter:
    """I count. That is all."""
    def __init__(self, initial=0): # конструктор
        self.value = initial # запись атрибута

    def increment(self):
        self.value += 1

    def get(self):
        return self.value # чтение атрибута
In [24]:
c = Counter(238)
c.increment()
c.get()
Out[24]:
239
  • В отличие от Java и C++ в Python нет “магического” ключевого слова this. Первый аргумент конструктора __init__ и всех остальных методов — экземпляр класса, который принято называть self.
  • Синтаксис языка не запрещает называть его по-другому, но так делать не рекомендуется.
  • Атрибуты добавляются к экземпляру посредством присваивания к self конструкцией вида: self.some_attribute = value.
  • В Python нет модификаторов доступа к атрибутам и методам: почти всё можно читать и присваивать.
  • Для того чтобы различать публичные и внутренние атрибуты визуально, к внутренним атрибутам добавляют в начало символ подчеркивания:

http://mit.spbau.ru/sewiki/images/2/2f/Python_2014_04.pdf (см. начиная со слайда 18)