Я хочу определить двумерный массив без инициализированной длины следующим образом:
Matrix = [][]
Но это не работает...
Я пробовал код ниже, но это тоже неправильно:
Matrix = [5][5]
Ошибка:
Traceback ...
IndexError: list index out of range
В чем моя ошибка?
python
matrix
syntax-error
Масуд Абасян
источник
источник
Ответы:
Технически вы пытаетесь проиндексировать неинициализированный массив. Вы должны сначала инициализировать внешний список списками, прежде чем добавлять элементы; Python называет это «понимание списка».
Теперь вы можете добавить элементы в список:
Обратите внимание, что матрица имеет адрес «y», то есть «индекс y» стоит перед «индексом x».
Хотя вы можете называть их по своему желанию, я смотрю на это таким образом, чтобы избежать путаницы, которая может возникнуть при индексации, если вы используете «x» для внутреннего и внешнего списков и хотите использовать неквадратную матрицу.
источник
range
для создания внутренних списков напрямую:[range(5) for x in range(5)]
[0] * w
часть хороша, но[[0] * w] * h]
даст неожиданное поведение. Попробуйтеmat = [[0] * 3] * 3; mat[0][1] = 10; print(mat == [[0, 10, 0], [0, 10, 0], [0, 10, 0]])
иmat = [[0] * 3 for i in range(3)]; mat[0][1] = 10; print(mat == [[0, 10, 0], [0, 0, 0], [0, 0, 0]])
.Если вы действительно хотите матрицу, вам лучше использовать
numpy
. В матричных операцияхnumpy
чаще всего используется тип массива с двумя измерениями. Есть много способов создать новый массив; одна из наиболее полезных -zeros
функция, которая принимает параметр формы и возвращает массив заданной формы со значениями, инициализированными равными нулю:Вот некоторые другие способы создания двумерных массивов и матриц (с выходом, удаленным для компактности):
numpy
также предоставляетmatrix
тип, но он больше не рекомендуется для любого использования и может быть удаленnumpy
в будущем.источник
np.matrix
для представления. Правильный способ представить матрицу в NumPy с помощьюarray
.array
s вместо матриц. Хотя это не всегда поощряется, существуют законные причины для использованияmatrix
- контекст имеет значение.matrix
? С тех пор, как@
оператор был введен, кажется, есть еще одна причина, так как этот пост был написан.numpy
сейчас документы показывают, что класс может быть исключен и удален в будущем, поэтому я исключил его из ответа.Вот более короткая запись для инициализации списка списков:
К сожалению, сокращение этого до чего-то вроде
5*[5*[0]]
не работает, потому что у вас получается 5 копий одного и того же списка, поэтому при изменении одного из них все они меняются, например:источник
[0]*5
?[[0]*5 for _ in range(5)]
с анонимным счетчиком циклов вы не используете[0]*5
хорошо работает. Теперь я понимаю, почему[{0}]*8
это тоже плохая идея.Если вы хотите создать пустую матрицу, правильный синтаксис
И если вы хотите сгенерировать матрицу размера 5, заполненную 0,
источник
Если вам нужен только двумерный контейнер для хранения некоторых элементов, вы можете вместо этого использовать словарь:
Тогда вы можете сделать:
Это работает, потому что
1,2
это кортеж, и вы используете его в качестве ключа для индексации словаря. Результат похож на тупую разреженную матрицу.Как указано osa и Josap Valls, вы также можете использовать
Matrix = collections.defaultdict(lambda:0)
так, чтобы отсутствующие элементы имели значение по умолчанию0
.Далее Ватсал отмечает, что этот метод, вероятно, не очень эффективен для больших матриц и должен использоваться только в не критичных для производительности частях кода.
источник
import collections; Matrix = collections.defaultdict(float)
, чтобы заменить нули на неинициализированные элементы.В Python вы будете создавать список списков. Вы не должны объявлять размеры заранее, но вы можете. Например:
Теперь matrix [0] [0] == 2 и matrix [1] [0] == 3. Вы также можете использовать синтаксис понимания списка. Этот пример использует его дважды для построения «двумерного списка»:
источник
extend
Было бы также полезно в первом случае: если вы начнете сm = [[]]
, то вы можете добавить к внутреннему списку (расширить строку) с помощьюm[0].extend([1,2])
, и добавить к внешнему списку (добавить новую строку) с помощьюm.append([3,4])
, эти операции оставят вас с[[1, 2], [3, 4]]
.Принятый ответ хороший и правильный, но мне потребовалось некоторое время, чтобы понять, что я мог бы также использовать его для создания полностью пустого массива.
результаты в
источник
Вы должны составить список списков, и лучший способ - использовать вложенные представления:
В вашем
[5][5]
примере вы создаете список с целым числом «5» внутри и пытаетесь получить доступ к его 5-му элементу, и это естественным образом вызывает ошибку IndexError, поскольку 5-го элемента нет:источник
Почему такой длинный код, который тоже у
Python
тебя спрашивают?Давным-давно, когда мне было неудобно с Python, я видел однострочные ответы для написания 2D-матрицы и говорил себе, что больше не буду использовать 2-D матрицу в Python. (Эти строки были довольно страшными, и они не дали мне никакой информации о том, что делал Python. Также обратите внимание, что я не знаю об этих сокращениях.)
В любом случае, вот код для новичка, который приходит из C, CPP и Java фона
Примечание для любителей и экспертов Python: Пожалуйста, не отказывайтесь от голосования только потому, что я написал подробный код.
источник
Переписать для удобства чтения:
источник
Использование:
* 5 для первого измерения работает, потому что на этом уровне данные неизменны.
источник
matrix = [[0]*cols for _ in range(rows)]
Чтобы объявить матрицу нулей (единиц):
например
или numpy.ones ((x, y)), например
Возможны даже три измерения. ( http://www.astro.ufl.edu/~warner/prog/python.html см. -> Многомерные массивы)
источник
Так я обычно создаю 2D-массивы в Python.
Я нахожу этот синтаксис легко запоминающимся по сравнению с использованием двух циклов for в понимании списка.
источник
Я пишу свой первый скрипт на Python, и меня немного смутил пример квадратной матрицы, поэтому я надеюсь, что приведенный ниже пример поможет вам сэкономить время:
так что
источник
Используя NumPy, вы можете инициализировать пустую матрицу следующим образом:
А позже добавьте данные так:
источник
Я читаю через запятую файлы, как это:
Список «data» - это список списков с индексом data [row] [col]
источник
Если вы хотите иметь возможность думать о нем как о двумерном массиве, а не думать о нем как о списке списков (на мой взгляд, это более естественно), вы можете сделать следующее:
Результатом является список (не массив NumPy), и вы можете перезаписать отдельные позиции числами, строками и так далее.
источник
numpy.matrix
эквивалентноnumpy.zeros
без нулей без списка?Для этого и создан словарь !
Вы можете определить ключи и значения двумя способами:
или
Результат:
источник
Использование:
Я думаю, что NumPy - это путь. Выше приведено общее, если вы не хотите использовать NumPy.
источник
используя список:
с помощью dict: вы также можете сохранить эту информацию в хеш-таблице для быстрого поиска, как
матрица ['1'] даст вам результат за O (1) раз
* nb : вам нужно иметь дело со столкновением в хеш-таблице
источник
Если у вас нет информации о размере до начала, создайте два одномерных списка.
Сохраните всю строку в 1-м списке. После этого добавьте список 1 в список 2:
Вывод:
источник
Будьте осторожны с этим коротким выражением, смотрите полное объяснение в ответе @ FJ
источник
Matrix[0], Matrix[1], ..., Matrix[4]
все они указывают на один и тот же массив, поэтому послеMatrix[0][0] = 3
вы можете ожидатьMatrix[0][0] == Matrix[1][0] == ... == Matrix[4][0] == 3
.Будет быстрее чем:
источник
[[0]*(L) for i in range(W)]
должно быть ,[[0]*(L) for _ in range(W)]
так какi
нигде не используетсяВы можете создать пустой двумерный список, вложив две или более квадратных скобок или третью скобку (
[]
разделенных запятой) квадратными скобками, как показано ниже:Теперь предположим, что вы хотите добавить 1, а
Matrix[0][0]
затем введите:Теперь введите Matrix и нажмите Enter. Выход будет:
источник
Попробуй это:
источник
Если вам нужна матрица с предопределенными числами, вы можете использовать следующий код:
источник
Вот фрагмент кода для создания матрицы в python:
Пожалуйста, предложите, если я что-то пропустил.
источник