Создание двумерного массива в Python

Как создать двумерный массив в python

Как создать двумерный массив в python

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

Наиболее простой способ – использовать вложенные списки. Например, конструкция [[0 for _ in range(колонок)] for _ in range(строк)] создаёт прямоугольный массив, заполненный нулями. При этом генератор списка гарантирует независимость строк, что исключает ошибки, возникающие при копировании ссылок.

Для работы с большими массивами рациональнее применять библиотеку NumPy. Она предоставляет тип ndarray, позволяющий выполнять операции над целыми блоками данных быстрее и компактнее, чем при использовании обычных списков. Дополнительно доступны функции zeros(), ones(), arange(), упрощающие инициализацию двумерных структур.

Выбор способа зависит от задач: списки подходят для учебных примеров и небольших программ, а NumPy – для матричных вычислений, анализа данных и научных расчётов.

Инициализация двумерного массива списками

Инициализация двумерного массива списками

В Python двумерный массив часто представляют в виде списка списков. Такой подход позволяет напрямую управлять структурой и содержимым.

Простейший способ создания:

matrix = [[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]

Для инициализации с заданными размерами удобно использовать генераторы списков:

rows, cols = 3, 4
matrix = [[0 for _ in range(cols)] for _ in range(rows)]
  • Каждая строка создаётся независимо, что исключает ошибки при изменении элементов.
  • Внутренний цикл отвечает за количество столбцов, внешний – за количество строк.

Ошибку вызывает использование умножения списка:

matrix = [[0] * cols] * rows  # все строки указывают на один объект

Изменение одного элемента приведёт к изменению соответствующего элемента во всех строках. Правильный вариант – только через вложенные генераторы или циклы.

  1. Для статичных значений используйте явное перечисление.
  2. Для динамических размеров применяйте генераторы списков.
  3. Избегайте копирования строк через оператор *.

Создание массива с заданным размером и заполнением

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

Пример:

rows, cols = 3, 4
value = 0
matrix = [[value for _ in range(cols)] for _ in range(rows)]
print(matrix)

В результате будет создан список списков размером 3×4, где каждый элемент равен 0.

Если требуется заполнить массив уникальными объектами (например, пустыми списками), нельзя использовать умножение списков, так как все строки будут ссылаться на один и тот же объект:

matrix = [[[]] * cols for _ in range(rows)]  # неверный подход

Правильный вариант:

matrix = [[[] for _ in range(cols)] for _ in range(rows)]

Таким образом каждая строка будет содержать независимые элементы.

Использование генераторов списков для компактного кода

Генераторы списков позволяют создать двумерный массив в одну строку без дополнительных циклов. Например, квадратную матрицу 3×3, заполненную нулями, можно задать так:

matrix = [[0 for _ in range(3)] for _ in range(3)]

Каждый внутренний генератор формирует строку, а внешний объединяет их в общий список. Такой приём исключает дублирование кода и делает структуру наглядной.

При необходимости заполнения значениями по формуле генератор также удобен. Пример: массив 4×4, где элемент равен сумме индексов:

matrix = [[i + j for j in range(4)] for i in range(4)]

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

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

Двумерный массив в Python обычно создаётся как список списков. Первый индекс указывает на строку, второй – на столбец.

Пример:

matrix = [
[10, 20, 30],
[40, 50, 60],
[70, 80, 90]
]
print(matrix[0][1])  # 20
print(matrix[2][2])  # 90

Индексация начинается с нуля. matrix[0][0] – первый элемент первой строки. Попытка обратиться к несуществующему индексу вызовет IndexError.

Для перебора значений строки используется цикл:

for value in matrix[1]:
print(value)

Чтобы получить все элементы определённого столбца, можно использовать генераторное выражение:

column = [row[2] for row in matrix]
print(column)  # [30, 60, 90]

При работе с большими массивами рекомендуется предварительно проверять размеры: len(matrix) для количества строк и len(matrix[0]) для количества столбцов.

Изменение значений внутри двумерного массива

Изменение значений внутри двумерного массива

Элементы двумерного массива в Python изменяются с помощью указания индексов строки и столбца. Индексация начинается с нуля, поэтому первый элемент располагается по адресу [0][0].

Пример:

matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
matrix[1][2] = 99
print(matrix)
# [[1, 2, 3], [4, 5, 99], [7, 8, 9]]

Изменение можно выполнять и в цикле. Например, заменить все элементы на их квадраты:

for i in range(len(matrix)):
for j in range(len(matrix[i])):
matrix[i][j] = matrix[i][j] ** 2

Если массив прямоугольный, используйте len(matrix[i]) для точного определения количества столбцов в каждой строке. Это гарантирует корректный обход даже при неодинаковой длине вложенных списков.

Перебор элементов вложенными циклами

Для обхода двумерного массива в Python используется вложенный цикл: внешний цикл проходит по строкам, внутренний – по элементам каждой строки. Это обеспечивает доступ к каждому значению по индексам.

Пример перебора массива 3×3:

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

for i in range(len(matrix)):

  for j in range(len(matrix[i])):

    print(matrix[i][j])

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

for row in matrix:

  for item in row:

    print(item)

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

total = sum(item for row in matrix for item in row)

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

Копирование и независимость строк массива

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

matrix = [[0]*3]*4

все строки массива будут ссылками на один и тот же список. Изменение элемента в одной строке затронет остальные:

matrix[0][1] = 5 – этот элемент изменит все строки в позиции [1].

Чтобы строки были независимыми, применяют генератор списков:

matrix = [[0 for _ in range(3)] for _ in range(4)]

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

Для копирования существующего массива используют модуль copy. Поверхностное копирование сохраняет независимость внешнего списка, но вложенные списки остаются общими:

import copy
shallow_copy = copy.copy(matrix)

Глубокое копирование создает полные независимые копии всех строк:

deep_copy = copy.deepcopy(matrix)

Следует проверять идентичность объектов через id() для подтверждения независимости строк:

Операция Результат id()
Присваивание одной строки другой одинаковые id
Генератор списков разные id
copy.copy() внешний список разный, вложенные одинаковые
copy.deepcopy() все id различны

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

Работа с массивами через библиотеку NumPy

Работа с массивами через библиотеку NumPy

NumPy предоставляет высокопроизводительные структуры данных для работы с многомерными массивами. Основной объект – ndarray, который поддерживает массивы любой размерности и эффективные операции над ними.

Создание двумерного массива:

import numpy as np
array_2d = np.array([[1, 2, 3], [4, 5, 6]])

Основные операции с массивами:

  • Определение формы массива: array_2d.shape – возвращает кортеж (строки, столбцы).
  • Тип элементов: array_2d.dtype – помогает контролировать память.
  • Индексация и срезы: array_2d[0, 1] – доступ к элементу первой строки второго столбца.
  • Математические операции выполняются поэлементно: array_2d * 2 удваивает все элементы.
  • Агрегация: np.sum(array_2d, axis=0) суммирует по столбцам, axis=1 – по строкам.

Генерация массивов полезна для тестирования и вычислений:

  • np.zeros((3,4)) – создаёт массив 3×4, заполненный нулями.
  • np.ones((2,5)) – массив 2×5 из единиц.
  • np.arange(0, 10, 2).reshape(2,3) – создаёт массив с шагом и изменяет форму.
  • np.random.randint(0, 100, size=(4,4)) – случайные целые числа.

Изменение формы массива без копирования данных:

reshaped = array_2d.reshape(3,2)

Копирование и изменение данных:

  • array_copy = array_2d.copy() – создаёт независимую копию.
  • array_2d.flatten() – преобразует массив в одномерный.

NumPy поддерживает логические операции и фильтрацию:

mask = array_2d > 3
filtered = array_2d[mask]

Эти возможности делают NumPy удобным инструментом для работы с двумерными массивами и ускоряют вычисления за счёт оптимизированного кода на C.

Вопрос-ответ:

Как создать двумерный массив в Python с помощью списков?

В Python двумерный массив можно реализовать как список списков. Каждый вложенный список представляет собой строку массива. Например, выражение matrix = [[0, 1, 2], [3, 4, 5], [6, 7, 8]] создаёт массив размером 3×3. Элементы массива можно менять через индексацию: matrix[0][1] = 9 заменит второй элемент первой строки на 9.

Можно ли создать двумерный массив одинакового значения без ручного перечисления всех элементов?

Да, можно использовать генераторы списков для автоматического заполнения массива. Например, выражение matrix = [[0 for _ in range(5)] for _ in range(3)] создаёт массив размером 3×5, где все элементы равны нулю. Такой подход удобен при работе с большими массивами, так как не требует ручного перечисления значений.

В чём разница между matrix = [[0]*5]*3 и использованием вложенных генераторов списков?

Выражение [[0]*5]*3 создаёт список из трёх ссылок на один и тот же внутренний список. Это означает, что изменение элемента в одной строке повлечёт изменения во всех строках. Вложенные генераторы списков, например [[0 for _ in range(5)] for _ in range(3)], создают отдельный список для каждой строки, поэтому изменения затрагивают только конкретную строку.

Как получить размер двумерного массива в Python?

Размер двумерного массива определяется количеством строк и количеством элементов в каждой строке. Если массив реализован как список списков, количество строк можно узнать через len(matrix), а количество элементов в строке — через len(matrix[0]). Например, для массива matrix = [[1,2,3],[4,5,6]] количество строк равно 2, а количество столбцов — 3.

Ссылка на основную публикацию