Как инициировать 2-D массив на Python

  1. Метод понимания списка для инициализации двухмерного массива
  2. Вложенный метод range для инициализации двухмерного массива
  3. numpy метод для инициирования 2D-массива

В этом учебном руководстве будут представлены различные методы инициализации двухмерного массива на языке Python. В следующих примерах мы создадим 2-D массив 3x5.

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

>>> column, row = 3, 5
>>> array2D = [[0 for _ in range(row)] for _ in range(column)]
>>> array2D
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

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

Вложенный метод range для инициализации двухмерного массива

Если вас не волнует начальное значение в 2-D массиве, то значение 0 может быть даже удалено.

На Python 2.x

>>> column, row = 3, 5
>>> A = [range(row) for _ in range(column)]
>>> A
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]

На Python 3.x

>>> column, row = 3, 5
>>> A = [range(row) for _ in range(column)]
>>> A
[range(0, 5), range(0, 5), range(0, 5)]

Мы не могли просто использовать range(x) для инициации 2-D массива на Python 3.x, так как range возвращает объект, содержащий последовательность целых чисел на Python 3.x, а не список целых чисел, как на Python 2.x.

range на Python 3.x больше похож на xrange на Python 2.x. Объект range на Python 3.x является неизменяемым, поэтому вы не присваиваете элементы его элементов.

Если вам нужно присвоить элемент, вам нужно конвертировать объект range в list.

>>> A = [list(range(row)) for _ in range(column)]
>>> A
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]

[0] * n метод для инициирования 2D массива

Один питонический способ инициировать двухмерный массив может быть таким.

>>> column, row = 3, 5
>>> A = [[0]*row for _ in range(column)]
>>> A
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

Хотя мы должны быть осторожны, когда используем умножение списков, потому что оно просто создает последовательность с многократными ссылками на один и тот же объект, мы освобождаемся от использования [0]*n здесь, потому что объект данных 0 является неизменяемым, так что мы никогда не столкнемся с проблемами даже при ссылках на один и тот же неизменяемый объект.

numpy метод для инициирования 2D-массива

Кроме нативного массива Python, numpy должен быть лучшим вариантом для создания двухмерного массива, а точнее, матрицы.

Вы можете создать матрицу, заполненную нулями с numpy.zeros.

>>> import numpy as np
>>> column, row = 3, 5
>>> np.zeros(column, row)
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])

Или инициируйте матрицу, заполненную ones с numpy.ones.

>>> import numpy as np
>>> column, row = 3, 5
>>> np.ones((column, row))
array([[1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.]])

Вы даже можете создать новый массив, не инициализируя записи с помощью numpy.empty.

>>> import numpy as np
>>> column, row = 3, 5
>>> np.empty((5,5))
array([[6.23042070e-307, 4.67296746e-307, 1.69121096e-306,
        1.33511562e-306, 1.89146896e-307],
       [7.56571288e-307, 3.11525958e-307, 1.24610723e-306,
        1.37962320e-306, 1.29060871e-306],
       [2.22518251e-306, 1.33511969e-306, 1.78022342e-306,
        1.05700345e-307, 1.11261027e-306],
       [1.11261502e-306, 1.42410839e-306, 7.56597770e-307,
        6.23059726e-307, 1.42419530e-306],
       [7.56599128e-307, 1.78022206e-306, 8.34451503e-308,
        2.22507386e-306, 7.20705877e+159]])
Примечания

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

Сопутствующая статья - Python Array

  • Как считать вхождения элемента в одномерном массиве на Python
  • comments powered by Disqus