05

NumPy

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

In [6]:
import numpy as np

a = np.array([1,2,3], float) # Однмемерный массив из списка 
b = np.repeat(-1. ,10) # Массив полученные повоторением исходного объекта
c = np.zeros((3, 5)) # Матрица из нулей размера 3х5
d = np.ones((2, 2, 2)) # Трехмерный массив из единиц
e = np.eye(5) # Единичная матрица
print(a, b, c, d, e, sep='\n\n')
print(c.shape) # Возвращает размерность массива, для двумерного это количество строк и столбцов
[ 1.  2.  3.]

[-1. -1. -1. -1. -1. -1. -1. -1. -1. -1.]

[[ 0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.]]

[[[ 1.  1.]
  [ 1.  1.]]

 [[ 1.  1.]
  [ 1.  1.]]]

[[ 1.  0.  0.  0.  0.]
 [ 0.  1.  0.  0.  0.]
 [ 0.  0.  1.  0.  0.]
 [ 0.  0.  0.  1.  0.]
 [ 0.  0.  0.  0.  1.]]
(3, 5)

Арифметические операции с массивами и векторизация

Полезной особенностью numpy-массивов является так называемая векторизация --- возможность делать быстрые поэлементные операции с массивами без использования цикла for.

In [7]:
a = np.array([1,2,3], float)
b = np.array([5,2,6], float)
print(a + b)
print(a - b)
print(a * b)
print(b / a)
print(a % b)
print(b ** a)
print(np.sqrt(a))
print(np.sum(a))
print(np.prod(b))
print(a.dot(b)) # Скалярное произведение
print(a > b)
print(np.where(a != 2, 1 / a, a))
[ 6.  4.  9.]
[-4.  0. -3.]
[  5.   4.  18.]
[ 5.  1.  2.]
[ 1.  0.  3.]
[   5.    4.  216.]
[ 1.          1.41421356  1.73205081]
6.0
60.0
27.0
[False False False]
[ 1.          2.          0.33333333]

Линейная алгебра

NumPy также предоставляет набор встроенных функций и методов для работы с линейной алгеброй. Это всё можно найти в под-модуле linalg.

In [8]:
a = np.array([[4, 2, 0], [9, 3, 7], [1, 2, 1]], float)
b = a.T # Транспонированый массив
print(np.linalg.det(a)) # Ищем детерминант 
vals, vecs = np.linalg.eig(a)
print(vals)
print(vecs)
-48.0
[ 8.85591316  1.9391628  -2.79507597]
[[-0.3663565  -0.54736745  0.25928158]
 [-0.88949768  0.5640176  -0.88091903]
 [-0.27308752  0.61828231  0.39592263]]

Операции с индексами

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

In [9]:
a = np.asarray([[1,2], [3,4]])
b = a.T # Транспонированый массив
print(b)
[[1 3]
 [2 4]]
In [10]:
b[0,0] = 10
print(b)
[[10  3]
 [ 2  4]]
In [11]:
print(a)
[[10  2]
 [ 3  4]]

Как мы видим при изменени переменной b изменилась переменная a. Это произошло потому, что обе эти переменные использубют один и тот же кусок памяти, но по разному

Чтение даных

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

In [15]:
data = np.loadtxt('./data/data.txt')
data
Out[15]:
array([[  0.,   0.],
       [  1.,   1.],
       [  2.,   4.],
       [  3.,   9.],
       [  4.,  16.],
       [  5.,  25.],
       [  6.,  36.],
       [  7.,  49.],
       [  8.,  64.],
       [  9.,  81.]])
^Наверх
Вниз