Основным объектом NumPy является однородный многомерный массив (в numpy называется numpy.ndarray). Это многомерный массив элементов (обычно чисел), одного типа.
Наиболее важные атрибуты объектов ndarray:
$ndarray.ndim$ - число измерений (чаще их называют "оси") массива.
$ndarray.shape$ - размеры массива, его форма. Это кортеж натуральных чисел, показывающий длину массива по каждой оси.
$ndarray.dtype$ - объект, описывающий тип элементов массива.
$numpy.array()$ - создает массив из обычных списков или кортежей Python
$numpy.zeros()$ - создает массив из нулей, в скобках необходимо указать размер массива.
$numpy.onec()$ - создает массив из едениц, в скобках необходимо указать размер массива.
$numpy.empty()$ - создает пустой массив ( значения массива какой-то мусор), в скобках необходимо указать размер массива.
Для начала необходимо подключить пакет NumPy.
# Можно делать так
import numpy
numpy.sum(a)
# Так делать не нужно
from numpy import *
sum(a)
# Так делать удобнее
import numpy as np
np.sum(a)
mas_1 = np.array((1, 2, 3))
mas_1
array([1, 2, 3])
L = [1, 2, 3]
mas_2 = np.array(L)
mas_2
array([1, 2, 3])
mas_3 = np.array(range(1,4))
mas_3
array([1, 2, 3])
Z = np.zeros((5,2))
Z
array([[ 0., 0.], [ 0., 0.], [ 0., 0.], [ 0., 0.], [ 0., 0.]])
Z.dtype
dtype('float64')
O = np.ones((2,5))
O
array([[ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.]])
O.shape
(2, 5)
E = np.empty(5)
E
array([ 0.00000000e+00, 0.00000000e+00, 1.54674219e-75, 1.15393392e-71, 0.00000000e+00])
E.ndim
1
Математические операции над массивами выполняются поэлементно. Создается новый массив, который заполняется результатами действия оператора. Операнды должны иметь один и тот же размер
print('mas_1: ', mas_1)
print('mas_2: ', mas_2)
mas_1: [1 2 3] mas_2: [1 2 3]
mas_1 == mas_2
array([ True, True, True], dtype=bool)
mas_1 + mas_2
array([2, 4, 6])
mas_1 - mas_2
array([0, 0, 0])
mas_1 * mas_2
array([1, 4, 9])
mas_1**mas_2
array([ 1, 4, 27])
mas_1 % 3 # При взятии остатка от деления на 0 возвращается 0
array([1, 2, 0])
mas_1 / (mas_1 - mas_1)
-c:1: RuntimeWarning: divide by zero encountered in true_divide
array([ inf, inf, inf])
np.cos(mas_1)
array([ 0.54030231, -0.41614684, -0.9899925 ])
np.sin(np.array([np.pi, 0, -np.pi]))
array([ 1.22464680e-16, 0.00000000e+00, -1.22464680e-16])
array = np.array([[1, 2, 3],[10, 1, 7]])
array
array([[ 1, 2, 3], [10, 1, 7]])
array.sum()
24
array.sum(axis = 0)
array([11, 3, 10])
array.max(axis = 1)
array([ 3, 10])
array.min()
1
np.prod(mas_1)
6
$np.dot()$ - матричное умножение
A = np.array([[1,2], [1,3]])
B = np.array([[1,1], [1,2]])
np.dot(A, B)
array([[3, 5], [4, 7]])
$np.linalg.det()$ - отпределитель матрицы
np.linalg.det(A)
1.0
Одномерные массивы осуществляют операции индексирования и срезов очень схожим образом с обычными списками.
array = np.array([[1, 2, 3],[10, 1, 7]])
array
array([[ 1, 2, 3], [10, 1, 7]])
array[0]
array([1, 2, 3])
array[0, 2]
3
array[1, -1]
7
array[1, 1:3]
array([1, 7])
array > 5
array([[False, False, False], [ True, False, True]], dtype=bool)
array
array([[ 1, 2, 3], [10, 1, 7]])
array[array > 5]
array([10, 7])
array[array == 1]
array([1, 1])
$ndarray.reshape()$ - возвращает аргумент с измененной формой
$ndarray.resize()$ - изменяет форму массива
$ndarray.ravel()$ - делает массив плоским
$ndarray.transpose()$ - транспонирование
$np.newaxis()$ - добавляет фиктивную ось
array.reshape(6, 1)
array([[ 1], [ 2], [ 3], [10], [ 1], [ 7]])
array.shape = (6, 1)
array
array([[ 1], [ 2], [ 3], [10], [ 1], [ 7]])
array.resize(2,3)
array
array([[ 1, 2, 3], [10, 1, 7]])
array.ravel()
array([ 1, 2, 3, 10, 1, 7])
array.transpose()
array([[ 1, 10], [ 2, 1], [ 3, 7]])
array[:,np.newaxis]
array([[[ 1, 2, 3]], [[10, 1, 7]]])
array.shape
(2, 3)
array[:,np.newaxis].shape
(2, 1, 3)
array[:, :, np.newaxis].shape
(2, 3, 1)
a = np.ones((6,3))
b = np.ones(6)*3
#a+b
a+b[:, np.newaxis]
array([[ 4., 4., 4.], [ 4., 4., 4.], [ 4., 4., 4.], [ 4., 4., 4.], [ 4., 4., 4.], [ 4., 4., 4.]])
При работе с массивами, их данные иногда необходимо копировать в другой массив. Это часто является источником путаницы, так как простое присваивание не создает ни копии массива, ни копии его данных.
new_array = array
new_array[0,0] = -1
new_array
array([[-1, 2, 3], [10, 1, 7]])
array
array([[-1, 2, 3], [10, 1, 7]])
чтобы не сталкиваться с такой проблемой необходимо использовать функцию $np.copy()$
copy_array = np.copy(array)
copy_array
array([[-1, 2, 3], [10, 1, 7]])
copy_array[0,0] = 1
copy_array
array([[ 1, 2, 3], [10, 1, 7]])
array
array([[-1, 2, 3], [10, 1, 7]])
Дан ndarray объект, найти четный максимальный элемент.
Найти максимальный элемент в векторе x среди элементов, после которых стоит нулевой.
Для x = np.array([6, 2, 0, 3, 0, 0, 5, 7, 0]) ответ 7.
Обратите внимание на функцию np.repeat