01 Авг 2023
8 мин
3565

Работа с NumPy Python

NumPy — это библиотека с открытым исходным кодом.

Содержание

Джим Хугунин разработал предка библиотеки NumPy — Numeric и дополнительный пакет функций — Numarray. Сама эта библиотека появилась только в 2005 году благодаря Трэвису Олифанту, который добавил несколько особенностей Numarray в Numeric.

Что такое NumPy и зачем она нужна

NumPy, или Numerical Python — это библиотека Python, которая предлагает:

  • мощный N-мерный массив;
  • высокоуровневые функции;
  • инструменты для интеграции кода C/C++ и Fortran.

А еще — эффективный многомерный контейнер общих данных. С помощью библиотеки можно определять произвольные типы.

Библиотека NumPy представляет собой базу данных с исходным кодом в открытом виде. Автор — проект SciPy. Библиотека помогает в различных задачах. Например:

  • linalg — реализация решений из линейной алгебры.
  • random — реализация функций для бесперебойной работы со случайными величинами.
  • fft — реализация прямого и обратного преобразования Фурье.

Научитесь создавать сервисы на языке Python и освойте профессию разработчика за 10 месяцев. Пройдите курс Skypro с гарантией трудоустройства — вас ждут новая работа, диплом установленного образца, портфолио с семью проектами на GitHub и полезные знакомства. Программа обучения соответствует требованиям к вакансиям начинающих Python-разработчиков на 100%.

Инструменты, которыми вы будете владеть после обучения

Обзор NumPy

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

Как создавать массивы

Вариантов несколько:

    1. Переделать список в NumPy-массивы
      X = np.array([[7, 8, 9], [10, 11, 12]])
      X
      
      Out:
      array([[7, 8, 9],
      [10, 11, 12]]) 
    2. Сделать копию.
      Y = X.copy()
      Y
      
      Out:
      array([[7, 8, 9],
      [10, 11, 12]])
    3. Сделать нулевой или единичный вариант определенного размера.
      A = np.zeros((2, 3))
      A
      
      Out:
      array([[0., 0., 0.],
      [0., 0., 0.]])
      B = np.ones((3, 2))
      B
      
      Out:
      array([[1., 1.],
      [1., 1.],
      [1., 1.]])
    4. Использовать примеры из библиотеки.
      A = np.array([[1, 2, 3], [4, 5, 6]])
      B = np.zeros_like(A)
      B
      
      Out:
      array([[0, 0, 0],
      [0, 0, 0]])
      A = np.array([[1, 2, 3], [4, 5, 6]])
      B = np.ones_like(A)
      B
      
      Out:
      array([[1, 1, 1],
      [1, 1, 1]])

    Если нужен двумерный квадратный, то можно сделать его единичной матрицей диагонального типа:

    A = np.eye(3)
    A
    
    Out:
    array([[1., 0., 0.],
    [0., 1., 0.],
    [0., 0., 1.]])

    Сделать от From (вкл) до To (не вкл) с шагом Step:

    From = 3.5
    To = 6
    Step = 0.5
    A = np.arange(From, To, Step)
    A
    
    Out:
    array([3.5, 4. , 4.5, 5. , 5.5])

    Изначально from = 0, step = 1, из-за этого есть вариант с одним параметром, который интерпретируется как To:

    A = np.arange(3)
    A
    
    Out:
    array([0, 1, 2])

    Либо с двумя — как From и To:

    A = np.arange(20, 26)
    A
    
    Out:
    array([20, 21, 22, 23, 24, 25])

    В третьем методе размеры передавались одним параметром (кортеж размеров). Вторым (в способах № 3 и № 4) можно указать желаемый тип элементов.

    A = np.zeros((2, 3), 'int')
    A
    
    Out:
    array([[0, 0, 0],
           [0, 0, 0]])
    B = np.ones((3, 2), 'complex')
    B
    
    Out:
    array([[1.+0.j, 1.+0.j],
           [1.+0.j, 1.+0.j],
           [1.+0.j, 1.+0.j]])

    Благодаря методу astype массив приводят к другому типу:

    A = np.ones((3, 2))
    B = A.astype('str')
    B
    
    Out:
    array([['1.0', '1.0'],
           ['1.0', '1.0'],
           ['1.0', '1.0']], dtype='<U32')

    Каждый тип есть в словаре sctypes:

    np.sctypes
    
    Out:
    {'int': [NumPy.int8, NumPy.int16, NumPy.int32, NumPy.int64],
     'uint': [NumPy.uint8, NumPy.uint16, NumPy.uint32, NumPy.uint64],
     'float': [NumPy.float16, NumPy.float32, NumPy.float64, NumPy.float128],
     'complex': [NumPy.complex64, NumPy.complex128, NumPy.complex256],
     'others': [bool, object, bytes, str, NumPy.void]}

    Базовые функции

  1. Есть такой объект:
    a = np.array([1,2,3], dtype='int32')
    
    print(a)
    [1 2 3]

    Для определения количества измерений есть функция ndim:

    print(a.ndim)
    1

    Здесь одномерный массив или вектор. Но для двумерного результат оказался бы другим:

    b = np.array([[1, 2, 3], [4, 5, 6]])
    
    print(b.ndim)
    2

    Для подсчета количества строк и столбцов есть функция shape:

    print(a.shape)
    (3, )

    Объяснение результата: вектор — это одномерный массив. У него в библиотеке NumPy есть только строки или элементы, поэтому функция shape выдала число 3.
    С двумерными массивами ситуация понятнее:

    print(b.shape)
    (2, 3)

    В b — две строки и три столбца.
    Для остальных массивов функция shape будет добавлять дополнительные цифры в кортеже через запятую:

    с = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
    
    print(c.shape)
    (2, 2, 3)

    Читается это так: в объекте два трехмерных массива с двумя строками и тремя столбцами.

    Кроме размерностей, указывают тип элементов через функцию dtype. Если не присваивать тип элементам вручную, по умолчанию будет задан int32. Количество элементов указывают через функцию size.

    Функции itemsize и nbytes показывают, что количество байт в памяти занимает один элемент, а еще — какой объем байт во всём массиве. Один элемент занимает три байта, а весь объект b из девяти элементов — 3 * 9 = 27 байт.

    Научиться применять эти и другие функции в разработке можно на курсе Skypro «Python-разработчик». За несколько месяцев изучите базовую теорию и отработаете новые навыки на практических заданиях. Во время всего обучения студентов поддерживают опытные наставники и кураторы. А специалисты центра карьеры помогают составить резюме и подготовиться к собеседованиям.

    Доступ к элементам

    NumPy-массивы позволяют смотреть элементы по отдельности или в сумме. Еще они дают возможность изменить значение внутри самого массива.

    ✔️ Помните, что замене подлежит как отдельный элемент, так и любые последовательности элементов.

    Для этих целей есть специальная конструкция с полноценной и упрощенной версиями.

    Создание специальных массивов

    NumPy может создавать массивы с уже забитыми ячейками — нулями или единицами.

      1. Массив NumPy из нулей через функцию zeros:
    	a = np.zeros((2, 2))
    
    print(a)
    [[0. 0.]
     [0. 0.]]

    Размер задается кортежем (2, 2). Если указать без скобок — будет ошибка:

    	a = np.zeros(2, 2)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: Cannot interpret '2' as a data type]

    Без скобок NumPy расценивает второй элемент как тип данных, который указывается для параметра dtype.
    Если указать одно число, получится вектор размером в два элемента. Тогда дополнительные скобки не нужны:

    a = np.zeros(2)
    
    print(a)
    [0. 0.]

    Стандартно элементам присваивается тип float64. Это дробные числа, которые занимают в памяти 64 бита, или 8 байт. Для получения целых чисел укажите это в параметре dtype через запятую:

    a = np.zeros(2, dtype='int32')
    
    print(a)
    [0 0]
  2. Массив NumPy из единиц через функцию ones:
    b = np.ones((4, 2, 2), dtype='int32')
    print(b)
    [[[1 1]
      [1 1]]
    
     [[1 1]
      [1 1]]
    
     [[1 1]
      [1 1]]
    
     [[1 1]
      [1 1]]]

    Здесь создан трехмерный массив из четырех двумерных, каждый из которых имеет две строки и два столбца. Элементы — с типом int32.

  3. Массив NumPy из произвольных чисел, отличных от нуля и единицы, через функцию full:
    c = np.full((2, 2), 5)
    
    print(c)
    [[5 5]
     [5 5]]

    Сначала указали размер массива через кортеж — (2, 2), потом число, которым заполним элементы, — 5.

  4. Массив NumPy случайных чисел через функции random.rand:
    d = np.random.rand(3, 2)
    
    print(d)
    [[0.76088962 0.14281283]
     [0.32124888 0.34894434]
     [0.66903093 0.72899792]]

    NumPy генерирует случайные числа в диапазоне от нуля до единицы с восемью знаками после запятой. Размер задается не через кортеж (3, 2), а через запятую — потому что в функции random.rand нет параметра dtype.
    Массив случайных чисел через функцию random.randint:

    e = np.random.randint(-5, 10, size=(4, 4))
    
    print(e)
    [[ 3  1 -4  3]
     [ 0 -2  5  3]
     [ 5 -1  9  2]
     [ 0 -4  9 -2]]
  5. Единичная матрица используется для линейной алгебры. По диагонали такой матрицы элементы равны единице, а остальные — нулю. Ее создают через функцию identity или eye:
    i = np.identity(4)
    
    print(i)
    [[1. 0. 0. 0.]
     [0. 1. 0. 0.]
     [0. 0. 1. 0.]
     [0. 0. 0. 1.]]

Математические операции

Массивы из NumPy можно использовать по-разному. Главное их преимущество — в поддержании стандартных арифметических операций. Например, в NumPy Python доступны сложение, деление, вычитание. Эта библиотека вычисляет синусы и многое другое из линейной алгебры, математической статистики.

Копирование и организация

Если в NumPy вы присвоите массив другой переменной, то получится ссылка на этот самый массив. Если в какой-то момент работы с программой потребуется создание независимой копии, то для этого есть функция copy. А для изменения объема и размера массива — функция reshape.

Дополнительные возможности

Можно использовать функцию накладывания или наслоения одних массивов поверх других: vstack и hstack.

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

Как установить NumPy

Можно использовать платформу Anaconda: там большой выбор разных библиотек, которые подойдут для работы Python.

  1. Перейдите на официальный сайт и скачайте последнюю версию софтов.
  2. Откройте установщик и установите программы по инструкции.
  3. Когда Python установится, откройте консоль и введите команду python3 для запуска интерпретатора Python.

В Anaconda есть много полезностей — NumPy, SciPy, Pandas, потому дополнительных установок не требуется. Достаточно проверить, что нужная библиотека работает. Для этого введите команды: import NumPy as np, потом a = np.array ([1,2,3]). Выведите значение переменной a — чтобы убедиться, что всё работает: print (a).

Можно установить библиотеки без лишних файлов через интегрированного питоновского менеджера пакетов PIP. Для этого нужно:

  • установить Python;
  • открыть программу и перейти во вкладку Downloads;
  • выбрать место установки и согласиться с пунктами;
  • потом скачать библиотеку NumPy.

Главное о библиотеке NumPy

  • NumPy нужна для решений из линейной алгебры, реализации функций для бесперебойной работы со случайными величинами и прямого и обратного преобразования Фурье.
  • Есть NumPy-функции для определения количества измерений, подсчета строк и столбцов, создания специальных массивов, математических операций и многого другого.
  • Установить NumPy можно двумя способами: через Anaconda и PIP.

Добавить комментарий