Представление или поверхностная копия

Разные объекты массивов могут использовать одни и те же данные. Метод view() создает новый объект массива, являющийся представлением тех же данных.

>>> c = a.view()>>> c is aFalse>>> c.base is a # c это представление данных, принадлежащих aTrue>>> c.flags.owndataFalse>>> >>> c.shape = (2,6) # форма а не поменяется>>> a.shape(3, 4)>>> c[0,4] = 1234 # данные а изменятся>>> aarray([[ 0, 1, 2, 3], [1234, 5, 6, 7], [ 8, 9, 10, 11]])

Срез массива это представление:

>>> s = a[:,1:3]>>> s[:] = 10>>> aarray([[ 0, 10, 10, 3], [1234, 10, 10, 7], [ 8, 10, 10, 11]])

Глубокая копия

Метод copy() создаст настоящую копию массива и его данных:

>>> d = a.copy() # создается новый объект массива с новыми данными>>> d is aFalse>>> d.base is a # d не имеет ничего общего с аFalse>>> d[0, 0] = 9999>>> aarray([[ 0, 10, 10, 3], [1234, 10, 10, 7], [ 8, 10, 10, 11]])

NumPy: random

Сейчас мы узнаем, как создавать массивы из случайных элементов и как работать со случайными элементами в NumPy.

Путь первый

Создавать списки, используя встроенный модуль random, а затем преобразовывать их в numpy.array:

>>> import numpy as np>>> import random>>> np.array([random.random() for i in range(10)])array([ 0.99538667, 0.16860511, 0.78952804, 0.09676316, 0.86110208, 0.89674666, 0.56401347, 0.63431468, 0.51110935, 0.64944844])

Но есть способ лучше.

Numpy.random

Для создания массивов со случайными элементами служит модуль numpy.random.

>>> import numpy as np # Импортировать numpy и писать np.random>>> np.random<module 'numpy.random' from '/usr/local/lib/python3.4/dist-packages/numpy/random/__init__.py'>>>> import numpy.random as rand # Можно и присвоить отдельное имя. Вопрос вкуса>>> rand<module 'numpy.random' from '/usr/local/lib/python3.4/dist-packages/numpy/random/__init__.py'>

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

Самый простой способ задать массив со случайными элементами - использовать функцию sample (или random, или random_sample, или ranf - это всё одна и та же функция).

>>> np.random.sample()0.6336371838734877>>> np.random.sample(3)array([ 0.53478558, 0.1441317 , 0.15711313])>>> np.random.sample((2, 3))array([[ 0.12915769, 0.09448946, 0.58778985], [ 0.45488207, 0.19335243, 0.22129977]])

Без аргументов возвращает просто число в промежутке [0, 1), с одним целым числом - одномерный массив, с кортежем - массив с размерами, указанными в кортеже (все числа - из промежутка [0, 1)).

С помощью функции randint или random_integers можно создать массив из целых чисел. Аргументы: low, high, size: от какого, до какого числа (randint не включает в себя это число, а random_integers включает), и size - размеры массива.



>>> np.random.randint(0, 3, 10)array([0, 2, 0, 1, 1, 0, 2, 2, 2, 0])>>> np.random.random_integers(0, 3, 10)array([2, 2, 3, 3, 1, 1, 0, 2, 3, 2])>>> np.random.randint(0, 3, (2, 10))array([[0, 1, 2, 0, 0, 0, 1, 1, 1, 2], [0, 0, 2, 2, 2, 0, 1, 2, 2, 1]])

Также можно генерировать числа согласно различным распределениям (Гаусса, Парето и другие). Чаще всего нужно равномерное распределение, которое можно получить с помощь функции uniform.

>>> np.random.uniform(2, 8, (2, 10))array([[ 3.1517914 , 3.10313483, 2.84007134, 3.21556436, 4.64531786, 2.99232714, 7.03064897, 4.38691765, 5.27488548, 2.63472454], [ 6.39470358, 5.63084131, 4.69996748, 7.07260546, 7.44340813, 4.10722203, 7.52956646, 4.8596943 , 3.97923973, 5.64505363]])

Выбор и перемешивание

Перемешать NumPy массив можно с помощью функции shuffle:

>>> a = np.arange(10)>>> aarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])>>> np.random.shuffle(a)>>> aarray([2, 8, 7, 3, 5, 0, 4, 9, 1, 6])

Также можно перемешать массив с помощью функции permutation (она, в отличие от shuffle, возвращает перемешанный массив). Также она, вызванная с одним аргументом (целым числом), возвращает перемешанную последовательность от 0 до N.

>>> np.random.permutation(10)array([1, 2, 3, 8, 7, 9, 4, 6, 5, 0])

Сделать случайную выборку из массива можно с помощью функции choice. Про неё стоит рассказать подробнее.

numpy.random.choice(a, size=None, replace=True, p=None)

· a : одномерный массив или число. Если массив, будет производиться выборка из него. Если число, то выборка будет производиться из np.arange(a).

· size : размерности массива. Если None, возвращается одно значение.

· replace : если True, то одно значение может выбираться более одного раза.

· p : вероятности. Это означает, что элементы можно выбирать с неравными вероятностями. Если не заданы, используется равномерное распределение.

>>> a = np.arange(10)>>> aarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])>>> np.random.choice(a, 10, p=[0.5, 0.25, 0.25, 0, 0, 0, 0, 0, 0, 0])array([0, 0, 0, 0, 1, 2, 0, 0, 1, 1])

Инициализация генератора случайных чисел

seed(число) - инициализация генератора.

>>> np.random.seed(1000)>>> np.random.random(10)array([ 0.65358959, 0.11500694, 0.95028286, 0.4821914 , 0.87247454, 0.21233268, 0.04070962, 0.39719446, 0.2331322 , 0.84174072])>>> np.random.seed(1000)>>> np.random.random(10)array([ 0.65358959, 0.11500694, 0.95028286, 0.4821914 , 0.87247454, 0.21233268, 0.04070962, 0.39719446, 0.2331322 , 0.84174072])

get_state и set_state - возвращают и устанавливают состояние генератора.

>>> np.random.seed(1000)>>> state = np.random.get_state()>>> np.random.random(10)array([ 0.65358959, 0.11500694, 0.95028286, 0.4821914 , 0.87247454, 0.21233268, 0.04070962, 0.39719446, 0.2331322 , 0.84174072])>>> np.random.set_state(state)>>> np.random.random(10)array([ 0.65358959, 0.11500694, 0.95028286, 0.4821914 , 0.87247454, 0.21233268, 0.04070962, 0.39719446, 0.2331322 , 0.84174072])

NumPy: linalg

Возведение в степень

linalg.matrix_power(M, n) - возводит матрицу в степень n.

Разложения

linalg.cholesky(a) - разложение Холецкого.

linalg.qr(a[, mode]) - QR разложение.

linalg.svd(a[, full_matrices, compute_uv]) - сингулярное разложение.

Некоторые характеристики матриц

linalg.eig(a) - собственные значения и собственные векторы.

linalg.norm(x[, ord, axis]) - норма вектора или оператора.

linalg.cond(x[, p]) - число обусловленности.

linalg.det(a) - определитель.

linalg.slogdet(a) - знак и логарифм определителя (для избежания переполнения, если сам определитель очень маленький).

Системы уравнений

linalg.solve(a, b) - решает систему линейных уравнений Ax = b.

linalg.tensorsolve(a, b[, axes]) - решает тензорную систему линейных уравнений Ax = b.

linalg.lstsq(a, b[, rcond]) - метод наименьших квадратов.

linalg.inv(a) - обратная матрица.

Замечания:

· linalg.LinAlgError - исключение, вызываемое данными функциями в случае неудачи (например, при попытке взять обратную матрицу от вырожденной).

· Подробная документация, как всегда, на английском:https://docs.scipy.org/doc/numpy/reference/routines.linalg.html

· Массивы большей размерности в большинстве функций linalg интерпретируются как набор из нескольких массивов нужной размерности. Таким образом, можно одним вызовом функции проделывать операции над несколькими объектами.

>>> a = np.arange(18).reshape((2,3,3))>>> aarray([[[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8]], [[ 9, 10, 11], [12, 13, 14], [15, 16, 17]]])>>> np.linalg.det(a)array([ 0., 0.])

Наши рекомендации