Как определить двумерный массив в Python
Я хочу определить двумерный массив без инициализированной длины следующим образом:
Matrix = [][]
но он не работает...
Я пробовал код ниже, но это тоже неправильно:
Matrix = [5][5]
Ошибка:
Traceback ...
IndexError: list index out of range
В чем моя ошибка?
Ответы
Ответ 1
Технически вы пытаетесь проиндексировать неинициализированный массив. Вы должны сначала инициализировать внешний список списками, прежде чем добавлять элементы; Python называет это
"понимание списка".
# Creates a list containing 5 lists, each of 8 items, all set to 0
w, h = 8, 5;
Matrix = [[0 for x in range(w)] for y in range(h)]
Теперь вы можете добавлять элементы в список:
Matrix[0][0] = 1
Matrix[6][0] = 3 # error! range...
Matrix[0][6] = 3 # valid
Обратите внимание, что матрица имеет адрес "y" по мажорному адресу, другими словами, "индекс y" стоит перед "индексом x".
print Matrix[0][0] # prints 1
x, y = 0, 6
print Matrix[x][y] # prints 3; be careful with indexing!
Несмотря на то, что вы можете называть их по своему желанию, я смотрю на это таким образом, чтобы избежать путаницы, которая может возникнуть при индексировании, если вы используете "x" для внутреннего и внешнего списков и хотите использовать неквадратную матрицу ,
Ответ 2
Если вам действительно нужна матрица, вам может быть лучше использовать numpy
. Матричные операции в numpy
чаще всего используют тип массива с двумя измерениями. Существует множество способов создания нового массива; одной из наиболее полезных является функция zeros
, которая принимает параметр формы и возвращает массив данной формы со значениями, инициализированными до нуля:
>>> import numpy
>>> numpy.zeros((5, 5))
array([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]])
numpy
также предоставляет тип matrix
. Он менее часто используется, а некоторые люди рекомендуют против использовать его. Но это полезно для людей, приезжающих в numpy
из Matlab и в некоторых других контекстах. Я думал, что включу его, так как мы говорим о матрицах!
>>> numpy.matrix([[1, 2], [3, 4]])
matrix([[1, 2],
[3, 4]])
Вот несколько других способов создания 2-мерных массивов и матриц (с удаленным выходом для компактности):
numpy.matrix('1 2; 3 4') # use Matlab-style syntax
numpy.arange(25).reshape((5, 5)) # create a 1-d range and reshape
numpy.array(range(25)).reshape((5, 5)) # pass a Python range and reshape
numpy.array([5] * 25).reshape((5, 5)) # pass a Python list and reshape
numpy.empty((5, 5)) # allocate, but don't initialize
numpy.ones((5, 5)) # initialize with ones
numpy.ndarray((5, 5)) # use the low-level constructor
Ответ 3
Ниже приведено короткое обозначение для инициализации списка списков:
matrix = [[0]*5 for i in range(5)]
К сожалению, сокращение этого на что-то вроде 5*[5*[0]]
действительно не работает, потому что вы получаете 5 копий одного и того же списка, поэтому при изменении одного из них все они меняются, например:
>>> matrix = 5*[5*[0]]
>>> matrix
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> matrix[4][4] = 2
>>> matrix
[[0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2]]
Ответ 4
Если вы хотите создать пустую матрицу, правильный синтаксис
matrix = [[]]
И если вы хотите создать матрицу размером 5, заполненную 0,
matrix = [[0 for i in xrange(5)] for i in xrange(5)]
Ответ 5
Если все, что вам нужно, это двухмерный контейнер для хранения некоторых элементов, вы можете удобно использовать словарь:
Matrix = {}
Затем вы можете сделать:
Matrix[1,2] = 15
print Matrix[1,2]
Это работает, потому что 1,2
является кортежем, и вы используете его в качестве ключа для индексации словаря. Результат похож на тупую разреженную матрицу.
Как указано osa и Josap Valls, вы также можете использовать Matrix = collections.defaultdict(lambda:0)
, чтобы отсутствующие элементы имели значение по умолчанию 0
.
Ватсал далее указывает, что этот метод, вероятно, не очень эффективен для больших матриц и должен использоваться только в критичных к критичности частях кода.
Ответ 6
В Python вы создадите список списков. Вам не нужно заранее объявлять размеры, но вы можете. Например:
matrix = []
matrix.append([])
matrix.append([])
matrix[0].append(2)
matrix[1].append(3)
Теперь матрица [0] [0] == 2 и матрица [1] [0] == 3. Вы также можете использовать синтаксис понимания списка. Этот пример использует его дважды для создания "двумерного списка":
from itertools import count, takewhile
matrix = [[i for i in takewhile(lambda j: j < (k+1) * 10, count(k*10))] for k in range(10)]
Ответ 7
Вы должны составить список списков, и наилучшим способом будет использование вложенных понятий:
>>> matrix = [[0 for i in range(5)] for j in range(5)]
>>> pprint.pprint(matrix)
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]
В вашем примере [5][5]
вы создаете список с целым числом "5" внутри и пытаетесь получить доступ к его 5-му элементу и, естественно, поднимаете IndexError, потому что нет 5-го элемента:
>>> l = [5]
>>> l[5]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
Ответ 8
Принятый ответ хорош и верен, но мне потребовалось некоторое время, чтобы понять, что я также могу использовать его для создания полностью пустого массива.
l = [[] for _ in range(3)]
приводит к
[[], [], []]
Ответ 9
rows = int(input())
cols = int(input())
matrix = []
for i in range(rows):
row = []
for j in range(cols):
row.append(0)
matrix.append(row)
print(matrix)
Почему такой длинный код, который тоже в Python
вы спрашиваете?
Давным-давно, когда мне было не удобно с Python, я увидел, что одна строка отвечает за запись 2D-матрицы и сказала себе, что я больше не буду использовать двумерную матрицу в Python. (Эти одиночные строки были довольно страшными, и он не дал мне никакой информации о том, что делал Python. Также обратите внимание, что я не знаю этих сокращений.)
В любом случае, здесь код для новичка, который выходит из C, CPP и фона Java
Примечание для любителей и экспертов Python: Пожалуйста, не голосуйте, потому что я написал подробный код.
Ответ 10
Объявить матрицу нулей (единиц):
numpy.zeros((x, y))
например.
>>> numpy.zeros((3, 5))
array([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]])
или numpy.ones((x, y))
например.
>>> np.ones((3, 5))
array([[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.]])
Возможны даже три измерения.
(http://www.astro.ufl.edu/~warner/prog/python.html см. → Многомерные массивы)
Ответ 11
Использование:
matrix = [[0]*5 for i in range(5)]
* 5 для первого измерения работает, потому что на этом уровне данные неизменяемы.
Ответ 12
Переписать для удобства чтения:
# 2D array/ matrix
# 5 rows, 5 cols
rows_count = 5
cols_count = 5
# create
# creation looks reverse
# create an array of "cols_count" cols, for each of the "rows_count" rows
# all elements are initialized to 0
two_d_array = [[0 for j in range(cols_count)] for i in range(rows_count)]
# index is from 0 to 4
# for both rows & cols
# since 5 rows, 5 cols
# use
two_d_array[0][0] = 1
print two_d_array[0][0] # prints 1 # 1st row, 1st col (top-left element of matrix)
two_d_array[1][0] = 2
print two_d_array[1][0] # prints 2 # 2nd row, 1st col
two_d_array[1][4] = 3
print two_d_array[1][4] # prints 3 # 2nd row, last col
two_d_array[4][4] = 4
print two_d_array[4][4] # prints 4 # last row, last col (right, bottom element of matrix)
Ответ 13
Я нахожусь на своем первом Python script, и я был немного смущен примером квадратной матрицы, поэтому, надеюсь, приведенный ниже пример поможет вам сэкономить некоторое время:
# Creates a 2 x 5 matrix
Matrix = [[0 for y in xrange(5)] for x in xrange(2)]
так что
Matrix[1][4] = 2 # Valid
Matrix[4][1] = 3 # IndexError: list index out of range
Ответ 14
Используя NumPy, вы можете инициализировать пустую матрицу следующим образом:
import numpy as np
mm = np.matrix([])
И позже добавьте такие данные:
mm = np.append(mm, [[1,2]], axis=1)
Ответ 15
Именно так я обычно создаю 2D-массивы в Python.
col = 3
row = 4
array = [[0] * col for _ in range(row)]
Я считаю, что этот синтаксис легко запомнить по сравнению с использованием двух циклов for в понимании списка.
Ответ 16
Я читаю в файлах, разделенных запятыми:
data=[]
for l in infile:
l = split(',')
data.append(l)
Список "данные" - это список списков с данными индекса [строка] [col]
Ответ 17
Если вы хотите думать, что это как 2D-массив, а не быть вынужденным думать в терминах списка списков (что гораздо более естественно, на мой взгляд), вы можете сделать следующее:
import numpy
Nx=3; Ny=4
my2Dlist= numpy.zeros((Nx,Ny)).tolist()
Результатом является список (а не массив NumPy), и вы можете перезаписывать отдельные позиции цифрами, строками и т.д.
Ответ 18
Использование:
import copy
def ndlist(*args, init=0):
dp = init
for x in reversed(args):
dp = [copy.deepcopy(dp) for _ in range(x)]
return dp
l = ndlist(1,2,3,4) # 4 dimensional list initialized with 0's
l[0][1][2][3] = 1
Я думаю, что NumPy - это путь. Вышеупомянутое является общим, если вы не хотите использовать NumPy.
Ответ 19
Что делает словарь для!
matrix = {}
Вы можете определить клавиши и значения двумя способами:
matrix[0,0] = value
или
matrix = { (0,0) : value }
Результат:
[ value, value, value, value, value],
[ value, value, value, value, value],
...
Ответ 20
Если у вас нет информации о размере до начала, создайте два одномерных списка.
list 1: To store rows
list 2: Actual two-dimensional matrix
Сохраните всю строку в первом списке. После этого добавьте список 1 в список 2:
from random import randint
coordinates=[]
temp=[]
points=int(raw_input("Enter No Of Coordinates >"))
for i in range(0,points):
randomx=randint(0,1000)
randomy=randint(0,1000)
temp=[]
temp.append(randomx)
temp.append(randomy)
coordinates.append(temp)
print coordinates
Выход:
Enter No Of Coordinates >4
[[522, 96], [378, 276], [349, 741], [238, 439]]
Ответ 21
используя список:
matrix_in_python = [['Roy',80,75,85,90,95],['John',75,80,75,85,100],['Dave',80,80,80,90,95]]
используя dict: вы также можете сохранить эту информацию в хеш-таблице для быстрого поиска, например
matrix = { '1':[0,0] , '2':[0,1],'3':[0,2],'4' : [1,0],'5':[1,1],'6':[1,2],'7':[2,0],'8':[2,1],'9':[2,2]};
matrix ['1'] даст вам результат в O (1) раз
* nb: вам нужно иметь дело с столкновением в хеш-таблице
Ответ 22
l=[[0]*(L) for _ in range(W)]
Будет быстрее, чем:
l = [[0 for x in range(L)] for y in range(W)]
Ответ 23
Попробуй это:
rows = int(input('Enter rows\n'))
my_list = []
for i in range(rows):
my_list.append(list(map(int, input().split())))
Ответ 24
Если вам нужна матрица с предопределенными числами, вы можете использовать следующий код:
def matrix(rows, cols, start=0):
return [[c + start + r * cols for c in range(cols)] for r in range(rows)]
assert matrix(2, 3, 1) == [[1, 2, 3], [4, 5, 6]]
Ответ 25
# Creates a list containing 5 lists initialized to 0
Matrix = [[0]*5]*5
Будьте внимательны к этому короткому выражению, см. полное объяснение в ответе @F.J
Ответ 26
Вы можете создать пустой двумерный список, вложив две или более квадратных скобок или третью скобку ([]
, разделенных запятой) квадратными скобками, как показано ниже:
Matrix = [[], []]
Теперь предположим, что вы хотите добавить 1 к Matrix[0][0]
, а затем введите:
Matrix[0].append(1)
Теперь введите Matrix и нажмите Enter. Выход будет:
[[1], []]