Преобразование и копирование массивов в NumPy

В NumPy преобразование и копирование массивов являются ключевыми операциями, которые позволяют эффективно манипулировать данными и управлять их представлением. Рассмотрим их подробно.

Преобразование массивов

Изменение формы массива

Функции для изменения формы массива не изменяют данные, а просто изменяют их представление:

  • reshape(newshape): Изменяет форму массива на указанную, не изменяя данных.

    import numpy as np
    
    a = np.array([1, 2, 3, 4, 5, 6])
    reshaped = a.reshape((2, 3))  # array([[1, 2, 3], [4, 5, 6]])
    • -1 можно использовать для автоматического вычисления размера одной из осей:

      reshaped = a.reshape((2, -1))  # array([[1, 2, 3], [4, 5, 6]])
  • resize(new_shape): Изменяет форму массива и, в отличие от reshape, может изменять размер массива (добавляя или удаляя элементы), изменяя его данные.

    resized = np.resize(a, (3, 4))  # array([[1, 2, 3, 4], [5, 6, 1, 2], [3, 4, 5, 6]])
  • ravel(): Возвращает одномерный массив, не изменяя исходный массив.

    flattened = reshaped.ravel()  # array([1, 2, 3, 4, 5, 6])
  • flatten(): Возвращает копию массива в одномерном виде.

    flattened_copy = reshaped.flatten()  # array([1, 2, 3, 4, 5, 6])
  • transpose(): Возвращает транспонированный массив. В многомерных массивах меняет местами оси.

    b = np.array([[1, 2, 3], [4, 5, 6]])
    transposed = b.T  # array([[1, 4], [2, 5], [3, 6]])
    • np.swapaxes(axis1, axis2): Меняет местами две оси массива.

      swapped = b.swapaxes(0, 1)  # array([[1, 4], [2, 5], [3, 6]])
  • reshape(-1): Преобразует многомерный массив в одномерный, аналогично ravel().

    flattened = b.reshape(-1)  # array([1, 4, 2, 5, 3, 6])

Добавление и удаление осей

  • np.expand_dims(a, axis): Добавляет ось к массиву в указанной позиции.

    c = np.array([1, 2, 3])
    expanded = np.expand_dims(c, axis=0)  # array([[1, 2, 3]])
    expanded = np.expand_dims(c, axis=1)  # array([[1], [2], [3]])
  • np.squeeze(a, axis=None): Удаляет оси с размером 1.

    d = np.array([[[1], [2], [3]]])
    squeezed = np.squeeze(d)  # array([1, 2, 3])

Копирование массивов

Копирование массивов может быть полным или поверхностным, и важно выбирать правильный метод в зависимости от задач:

Полное копирование

  • copy(): Создает полную копию массива, в которой изменения не затрагивают оригинал.

    a = np.array([1, 2, 3, 4])
    b = a.copy()  # Создание полной копии массива
    b[0] = 10
    # a = [1, 2, 3, 4]
    # b = [10, 2, 3, 4]

Поверхностное копирование (ссылки)

  • Присваивание массива другой переменной не создает копию, а только создает новую ссылку на тот же объект:

    a = np.array([1, 2, 3, 4])
    b = a  # b является ссылкой на a
    b[0] = 10
    # a = [10, 2, 3, 4]
    # b = [10, 2, 3, 4]

Копирование с помощью срезов

  • Срезы создают новые представления массива, а не копии, если не указано иное:

    a = np.array([1, 2, 3, 4])
    b = a[1:3]  # Срез массива
    b[0] = 10
    # a = [1, 10, 3, 4]
    # b = [10, 3]

Дополнительные операции преобразования

Преобразование типов

  • astype(dtype): Преобразует массив в другой тип данных.

    a = np.array([1.5, 2.5, 3.5])
    b = a.astype(int)  # array([1, 2, 3])

Объединение и разбиение массивов

  • np.concatenate((a1, a2, ...), axis=0): Объединяет массивы по указанной оси.

    a = np.array([1, 2, 3])
    b = np.array([4, 5, 6])
    concatenated = np.concatenate((a, b))  # array([1, 2, 3, 4, 5, 6])
  • np.hstack((a1, a2, ...)): Объединяет массивы горизонтально (по оси 1).

    a = np.array([[1], [2], [3]])
    b = np.array([[4], [5], [6]])
    hstacked = np.hstack((a, b))  # array([[1, 4], [2, 5], [3, 6]])
  • np.vstack((a1, a2, ...)): Объединяет массивы вертикально (по оси 0).

    a = np.array([1, 2, 3])
    b = np.array([4, 5, 6])
    vstacked = np.vstack((a, b))  # array([[1, 2, 3], [4, 5, 6]])
  • np.split(ary, indices_or_sections, axis=0): Разделяет массив на части.

    a = np.array([1, 2, 3, 4, 5, 6])
    split = np.split(a, 3)  # [array([1, 2]), array([3, 4]), array([5, 6])]

Удаление дублирующихся данных

  • np.unique(a): Возвращает отсортированный массив уникальных элементов.

    a = np.array([1, 2, 2, 3, 4, 4])
    unique = np.unique(a)  # array([1, 2, 3, 4])
  • np.unique(a, return_counts=True): Возвращает уникальные элементы и их частоту.

    unique, counts = np.unique(a, return_counts=True)  # (array([1, 2, 3, 4]), array([1, 2, 1, 2]))

Эти функции и методы помогут вам эффективно управлять массивами в NumPy, выполнять преобразования данных и работать с их копиями в зависимости от ваших потребностей.

Last updated