Основные методы создания массивов NumPy

NumPyBeginner
Практиковаться сейчас

Введение

Предварительные требования

Прежде чем приступить к этому курсу, вы должны обладать базовыми навыками программирования на Python. Если вы еще не изучили Python, вы можете начать с нашего Пути обучения Python.

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

Что такое NumPy?

NumPy (сокращение от Numerical Python) — это фундаментальная библиотека для научных вычислений на Python. Она предоставляет мощные структуры данных и функции для работы с большими массивами и матрицами числовых данных.

Почему NumPy вместо списков Python?

Хотя встроенные списки Python гибки и просты в использовании, они имеют ограничения при работе с числовыми данными:

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

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

Это Guided Lab, который предоставляет пошаговые инструкции, чтобы помочь вам учиться и практиковаться. Внимательно следуйте инструкциям, чтобы выполнить каждый шаг и получить практический опыт. Исторические данные показывают, что это лабораторная работа уровня средний с процентом завершения 69%. Он получил 100% положительных отзывов от учащихся.

Создание массивов из последовательностей Python

Самый простой способ создать массив NumPy — это преобразовать последовательность Python, такую как список или кортеж. Функция numpy.array() принимает последовательность в качестве аргумента и возвращает новый массив NumPy.

Понимание массивов NumPy

Прежде чем создавать массивы, давайте разберемся, что делает массивы NumPy особенными:

Измерения массива

  • 1D массив (вектор): Простой список чисел, например [1, 2, 3, 4]
  • 2D массив (матрица): Таблица чисел со строками и столбцами, как электронная таблица
  • 3D массив (тензор): Куб чисел, полезный для изображений или 3D-данных
Измерения массива

Ключевые отличия от списков Python

  • Однородность: Все элементы должны иметь один и тот же тип данных (обычно числа)
  • Фиксированный размер: После создания размер изменить нельзя
  • Эффективность: Значительно быстрее для математических операций
  • Богатая функциональность: Поддерживает векторизованные операции (операции над целыми массивами одновременно)

Импорт NumPy

В Python мы импортируем NumPy с использованием стандартного псевдонима np:

import numpy as np

Этот псевдоним np является широко принятой конвенцией в сообществе научных вычислений на Python.

Теперь давайте создадим несколько массивов. Откройте файл array_from_sequence.py из файлового проводника слева. Добавьте в него следующий код. Этот код импортирует библиотеку NumPy и создает одномерные (1D), двумерные (2D) и трехмерные (3D) массивы из списков Python.

Код Python для создания массивов NumPy
import numpy as np

## Создание 1D массива из списка
a1D = np.array([1, 2, 3, 4])
print("1D Array:")
print(a1D)

## Создание 2D массива из списка списков
a2D = np.array([[1, 2], [3, 4]])
print("\n2D Array:")
print(a2D)

## Создание 3D массива из вложенных списков
a3D = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print("\n3D Array:")
print(a3D)

Предложение: Вы можете скопировать приведенный выше код в свой редактор кода, затем внимательно прочитать каждую строку кода, чтобы понять ее функцию. Если вам требуется дополнительное объяснение, вы можете нажать кнопку "Объяснить код" 👆. Вы можете взаимодействовать с Labby для получения персонализированной помощи.

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

python array_from_sequence.py

Вы должны увидеть следующий вывод, который отображает созданные вами массивы:

1D Array:
[1 2 3 4]

2D Array:
[[1 2]
 [3 4]]

3D Array:
[[[1 2]
  [3 4]]

 [[5 6]
  [7 8]]]

Понимание типов данных (dtype)

Массивы NumPy имеют фиксированный тип данных для всех элементов, который указывается параметром dtype. Это отличается от списков Python, где каждый элемент может иметь разный тип.

Почему типы данных важны

  • Эффективность использования памяти: Различные типы используют разное количество памяти
  • Производительность: Операции оптимизированы для конкретных типов данных
  • Точность: Контролирует, как числа хранятся и вычисляются

Распространенные типы данных

  • int32 / int64: Целые числа (32 или 64 бита)
  • float32 / float64: Десятичные числа (32 или 64 бита)
  • complex: Комплексные числа
  • bool: Значения True/False

Вы можете указать тип данных при создании массива, используя параметр dtype, например np.array([1, 2], dtype=complex). Если вы не указываете dtype, NumPy автоматически выберет подходящий тип на основе входных данных.

Использование встроенных функций создания массивов

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

Зачем использовать эти функции?

Вместо написания np.array([0, 0, 0, 0, 0]), вы можете просто использовать np.zeros(5). Эти функции:

  • Быстрее: Оптимизированный код на C внутри.
  • Более читаемы: Назначение функции ясно из ее названия.
  • Эффективны по памяти: Прямое выделение памяти.
  • Удобны: Нет необходимости вручную указывать каждый элемент.

Откройте файл intrinsic_creation.py и добавьте следующий код. Этот скрипт демонстрирует несколько распространенных функций создания.

import numpy as np

## Создание массива с диапазоном элементов
## np.arange(start, stop, step) - похоже на range() в Python
## Сценарий использования: Создание последовательностей для циклов, генерация индексов
arr_range = np.arange(0, 10, 2)  ## [0, 2, 4, 6, 8]
print("Array from arange:")
print(arr_range)

## Создание массива с заданным количеством элементов между двумя точками
## np.linspace(start, stop, num_elements) - равномерно распределенные точки
## Сценарий использования: Создание точек для построения графиков, выборка данных
arr_linspace = np.linspace(0, 10, 5)  ## 5 точек от 0 до 10
print("\nArray from linspace:")
print(arr_linspace)

## Создание массива, заполненного нулями
## np.zeros((rows, columns)) - инициализация массивов для вычислений
## Сценарий использования: Предварительное выделение массивов перед заполнением вычисленными значениями
arr_zeros = np.zeros((2, 3))  ## массив нулей размером 2x3
print("\nArray of zeros:")
print(arr_zeros)

## Создание массива, заполненного единицами
## np.ones((rows, columns)) - инициализация единицами
## Сценарий использования: Создание масок, масштабирующих коэффициентов или начальных точек для алгоритмов
arr_ones = np.ones((3, 2))  ## массив единиц размером 3x2
print("\nArray of ones:")
print(arr_ones)

## Создание единичной матрицы
## np.eye(size) - квадратная матрица с единицами на диагонали и нулями в остальных местах
## Сценарий использования: Линейная алгебра, сброс преобразований, умножение матриц
identity_matrix = np.eye(3)  ## единичная матрица 3x3
print("\nIdentity matrix:")
print(identity_matrix)

Сохраните файл и выполните его из терминала.

python intrinsic_creation.py

Вывод покажет различные массивы, созданные этими функциями:

Array from arange:
[0 2 4 6 8]

Array from linspace:
[ 0.   2.5  5.   7.5 10. ]

Array of zeros:
[[0. 0. 0.]
 [0. 0. 0.]]

Array of ones:
[[1. 1.]
 [1. 1.]
 [1. 1.]]

Identity matrix:
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

Манипулирование существующими массивами

Вы также можете создавать новые массивы, модифицируя, объединяя или разделяя существующие. Этот раздел охватывает два важных понятия: представления (views) против копий (copies) и конкатенация массивов.

Представления против копий: понимание общего доступа к памяти

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

Что такое представление (View)?

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

Что такое копия (Copy)?

Копия (copy) создает совершенно новый массив в памяти со своими собственными данными. Изменения в копии не влияют на исходный массив, и наоборот.

Почему это важно

  • Представления эффективны по памяти: они не дублируют данные.
  • Представления быстры: нет накладных расходов на копирование.
  • Но представления могут вызывать неожиданные побочные эффекты: изменение представления изменяет исходные данные.
  • Копии безопаснее: изменения изолированы, но используют больше памяти.

Давайте также рассмотрим, как объединить несколько массивов в один больший массив.

Откройте файл array_manipulation.py и добавьте следующий код:

import numpy as np

## --- Часть 1: Представления против копий ---
a = np.arange(1, 5)
print("Original array 'a':", a)

## Создание представления первых двух элементов
b = a[:2]
b[0] = 99 ## Изменение представления
print("Modified view 'b':", b)
print("Array 'a' after modifying the view:", a) ## 'a' также изменяется

## Создание копии
c = a[:2].copy()
c[0] = 0 ## Изменение копии
print("\nModified copy 'c':", c)
print("Array 'a' after modifying the copy:", a) ## 'a' не изменяется

## --- Часть 2: Объединение массивов ---
A = np.ones((2, 2))
B = np.eye(2) * 2
C = np.zeros((2, 2))
D = np.diag((-3, -4))

## Объединение массивов в блочную матрицу
block_matrix = np.block([
    [A, B],
    [C, D]
])
print("\nBlock matrix:")
print(block_matrix)

Сохраните файл и запустите его из терминала.

python array_manipulation.py

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

Original array 'a': [1 2 3 4]
Modified view 'b': [99  2]
Array 'a' after modifying the view: [99  2  3  4]

Modified copy 'c': [0 2]
Array 'a' after modifying the copy: [99  2  3  4]

Block matrix:
[[ 1.  1.  2.  0.]
 [ 1.  1.  0.  2.]
 [ 0.  0. -3.  0.]
 [ 0.  0.  0. -4.]]

Чтение массивов из файла

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

Почему NumPy для ввода-вывода файлов?

  • Скорость: Значительно быстрее, чем построчное чтение с помощью Python
  • Определение типов: Автоматически определяет подходящие типы данных
  • Эффективность использования памяти: Загружает данные непосредственно в оптимизированные массивы
  • Удобство: Один вызов функции вместо сложного парсинга

Распространенные форматы файлов

  • CSV-файлы: значения, разделенные запятыми (наиболее распространенные)
  • TSV-файлы: значения, разделенные табуляцией
  • Текстовые файлы: разделенные пробелами или пользовательским разделителем
  • Бинарные файлы: для очень больших наборов данных (продвинутый уровень)

Для простых текстовых файлов, таких как CSV (Comma-Separated Values), NumPy предоставляет функцию np.loadtxt().

Скрипт настройки для этой лаборатории уже создал файл с именем data.csv в вашем каталоге проекта. Его содержимое:

col1,col2,col3
1.0,2.5,3.2
4.5,5.0,6.8
7.3,8.1,9.9

Теперь откройте файл read_from_file.py и добавьте следующий код для чтения этих данных.

Понимание параметров np.loadtxt

Функция np.loadtxt() имеет несколько важных параметров:

  • delimiter=',': Указывает, как разделены столбцы (запятая для CSV)
  • skiprows=1: Пропускает первую строку (обычно заголовки)
  • dtype: Необязательный — указывает тип данных (автоматически определяется, если не предоставлен)
  • usecols: Необязательный — указывает, какие столбцы считывать
  • comments: Необязательный — указывает символ комментария для игнорирования строк

Мы используем delimiter=',', чтобы указать, что столбцы разделены запятыми, и skiprows=1, чтобы пропустить строку заголовка.

import numpy as np

## Загрузка данных из CSV файла
try:
    ## Относительные пути вызовут ошибку валидации, пожалуйста, используйте абсолютные пути в лаборатории
    data = np.loadtxt('/home/labex/project/data.csv', delimiter=',', skiprows=1)
    print("Данные загружены из data.csv:")
    print(data)
except IOError:
    print("Ошибка: data.csv не найден.")

Сохраните файл и выполните его из терминала.

python read_from_file.py

Скрипт прочитает числовые данные из data.csv и выведет их в виде массива NumPy.

Данные загружены из data.csv:
[[1.  2.5 3.2]
 [4.5 5.  6.8]
 [7.3 8.1 9.9]]

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

Резюме

В этой лаборатории вы изучили основные методы создания массивов NumPy. Вы практиковались в создании массивов из списков Python, использовании встроенных функций, таких как np.arange и np.zeros, манипулировании существующими массивами через представления (views), копии (copies) и объединение, а также в загрузке данных из текстового файла с помощью np.loadtxt.

Эти навыки являются основой для почти всех задач численных и научных вычислений, которые вы будете выполнять с помощью Python. Обладая прочным пониманием создания массивов, вы теперь готовы к изучению более продвинутых манипуляций с массивами и математических операций в NumPy.