Eu quero definir uma matriz bidimensional sem um comprimento inicializado como este:
Matrix = [][]
mas não funciona...
Eu tentei o código abaixo, mas também está errado:
Matrix = [5][5]
Erro:
Traceback ...
IndexError: list index out of range
Qual é o meu erro?
python
matrix
syntax-error
Masoud Abasian
fonte
fonte
Respostas:
Tecnicamente, você está tentando indexar uma matriz não inicializada. Você precisa primeiro inicializar a lista externa com listas antes de adicionar itens; Python chama isso de "compreensão da lista".
Agora você pode adicionar itens à lista:
Observe que a matriz é o endereço "y" principal, ou seja, o "índice y" vem antes do "índice x".
Embora você possa nomeá-los como quiser, analiso desta maneira para evitar confusão que possa surgir com a indexação, se você usar "x" para as listas interna e externa e desejar uma matriz não quadrada.
fonte
range
para criar as listas internas diretamente:[range(5) for x in range(5)]
[0] * w
peça é boa, mas[[0] * w] * h]
produzirá um comportamento inesperado. Tentemat = [[0] * 3] * 3; mat[0][1] = 10; print(mat == [[0, 10, 0], [0, 10, 0], [0, 10, 0]])
emat = [[0] * 3 for i in range(3)]; mat[0][1] = 10; print(mat == [[0, 10, 0], [0, 0, 0], [0, 0, 0]])
.Se você realmente quer uma matriz, pode ser melhor usá-lo
numpy
. As operações de matriz nanumpy
maioria das vezes usam um tipo de matriz com duas dimensões. Existem muitas maneiras de criar uma nova matriz; uma das mais úteis é azeros
função, que pega um parâmetro de forma e retorna uma matriz da forma especificada, com os valores inicializados em zero:Aqui estão algumas outras maneiras de criar matrizes e matrizes 2-d (com a saída removida para compactar):
numpy
também fornece ummatrix
tipo, mas não é mais recomendado para nenhum uso e pode ser removidonumpy
no futuro.fonte
np.matrix
para representá-la. A maneira correta de representar uma matriz em numpy é com umarray
.array
s em vez de matrizes. Embora nem sempre seja incentivado, existem razões legítimas para o uso dematrix
questões de contexto.matrix
? Desde que o@
operador foi introduzido, parece haver um motivo a menos desde que este post foi escrito.numpy
documentos agora indicam que a classe pode ser preterida e removida no futuro, então tirei isso da resposta.Aqui está uma notação mais curta para inicializar uma lista de listas:
Infelizmente, encurtar isso para algo como
5*[5*[0]]
realmente não funciona, porque você acaba com 5 cópias da mesma lista; portanto, quando você modifica uma delas, todas elas mudam, por exemplo:fonte
[0]*5
?[[0]*5 for _ in range(5)]
com um contador de loop anônimo que você não está usando[0]*5
funciona muito bem. Agora entendo por[{0}]*8
que seria uma má ideia também.Se você deseja criar uma matriz vazia, a sintaxe correta é
E se você deseja gerar uma matriz de tamanho 5 preenchida com 0,
fonte
Se tudo o que você deseja é um contêiner bidimensional para conter alguns elementos, use um dicionário conveniente:
Então você pode fazer:
Isso funciona porque
1,2
é uma tupla e você está usando-a como uma chave para indexar o dicionário. O resultado é semelhante a uma matriz esparsa muda.Conforme indicado por osa e Josap Valls, você também pode usar
Matrix = collections.defaultdict(lambda:0)
para que os elementos ausentes tenham um valor padrão de0
.Vatsal aponta ainda que esse método provavelmente não é muito eficiente para matrizes grandes e deve ser usado apenas em partes do código que não são críticas para o desempenho.
fonte
import collections; Matrix = collections.defaultdict(float)
, substituir zeros por elementos não inicializados.No Python, você criará uma lista de listas. Você não precisa declarar as dimensões antes do tempo, mas pode. Por exemplo:
Agora matriz [0] [0] == 2 e matriz [1] [0] == 3. Você também pode usar a sintaxe de compreensão da lista. Este exemplo usa duas vezes para criar uma "lista bidimensional":
fonte
extend
também seria útil no primeiro caso: Se você começar comm = [[]]
, poderá adicionar à lista interna (estender uma linha) comm[0].extend([1,2])
e adicionar à lista externa (acrescentar uma nova linha) comm.append([3,4])
, essas operações o deixarão com[[1, 2], [3, 4]]
.A resposta aceita é boa e correta, mas demorei um pouco para entender que eu também poderia usá-la para criar uma matriz completamente vazia.
resulta em
fonte
Você deve fazer uma lista de listas e a melhor maneira é usar as compreensões aninhadas:
Nas suas
[5][5]
exemplo, você está criando uma lista com um número inteiro "5" dentro e tenta acessar seu quinto item, e isso naturalmente gera um IndexError porque não há um quinto item:fonte
Por que um código tão longo, que também em
Python
você também pergunta?Muito tempo atrás, quando eu não estava confortável com o Python, vi as respostas de linha única para escrever a matriz 2D e disse a mim mesma que não usaria a matriz 2-D no Python novamente. (Essas linhas únicas eram bastante assustadoras e não me deram nenhuma informação sobre o que o Python estava fazendo. Observe também que não conheço essas taquigrafia).
De qualquer forma, aqui está o código para um iniciante que tem experiência em C, CPP e Java
Nota para amantes e especialistas em Python: Por favor, não vote abaixo apenas porque escrevi um código detalhado.
fonte
Uma reescrita para facilitar a leitura:
fonte
Usar:
O * 5 para a primeira dimensão funciona porque nesse nível os dados são imutáveis.
fonte
matrix = [[0]*cols for _ in range(rows)]
Para declarar uma matriz de zeros (uns):
por exemplo
ou numpy.ones ((x, y)), por exemplo
Até três dimensões são possíveis. ( http://www.astro.ufl.edu/~warner/prog/python.html, consulte -> Matrizes multidimensionais)
fonte
É assim que costumo criar matrizes 2D em python.
Acho essa sintaxe fácil de lembrar em comparação com o uso de dois para loops em uma compreensão de lista.
fonte
Estou no meu primeiro script Python e fiquei um pouco confuso com o exemplo de matriz quadrada, então espero que o exemplo abaixo ajude você a economizar algum tempo:
de modo a
fonte
Usando o NumPy, você pode inicializar a matriz vazia assim:
E depois acrescente dados como este:
fonte
Eu li em arquivos separados por vírgula assim:
A lista "dados" é então uma lista de listas com dados de índice [linha] [col]
fonte
Se você quiser pensar nisso como uma matriz 2D, em vez de ser forçado a pensar no termo de uma lista de listas (muito mais natural na minha opinião), faça o seguinte:
O resultado é uma lista (não uma matriz NumPy) e você pode sobrescrever as posições individuais com números, cadeias de caracteres, o que for.
fonte
numpy.matrix
equivalentes anumpy.zeros
sem zeros sem estar na lista?É para isso que serve o dicionário !
Você pode definir chaves e valores de duas maneiras:
ou
Resultado:
fonte
Usar:
Eu acho que NumPy é o caminho a percorrer. O acima é genérico se você não quiser usar o NumPy.
fonte
usando a lista:
usando dict: você também pode armazenar essas informações na tabela de hash para pesquisas rápidas como
matriz ['1'] resultará em tempo O (1)
* nb : você precisa lidar com uma colisão na tabela de hash
fonte
Se você não tiver informações de tamanho antes do início, crie duas listas unidimensionais.
Armazene a linha inteira na 1ª lista. Quando terminar, anexe a lista 1 na lista 2:
Resultado:
fonte
Tenha cuidado com esta expressão curta, veja a explicação completa na resposta de @ FJ
fonte
Matrix[0], Matrix[1], ..., Matrix[4]
todos apontam para a mesma matriz; portantoMatrix[0][0] = 3
, você esperariaMatrix[0][0] == Matrix[1][0] == ... == Matrix[4][0] == 3
.Será mais rápido que:
fonte
[[0]*(L) for i in range(W)]
deve ser[[0]*(L) for _ in range(W)]
uma vez quei
não é usado em lugar algumVocê pode criar uma lista bidimensional vazia aninhando dois ou mais colchetes ou terceiro colchete (
[]
separados por vírgula) por um colchete , assim como abaixo:Agora, suponha que você queira anexar 1
Matrix[0][0]
e digitar:Agora, digite Matrix e pressione Enter. A saída será:
fonte
Tente o seguinte:
fonte
Caso precise de uma matriz com números predefinidos, você pode usar o seguinte código:
fonte
Aqui está o trecho de código para criar uma matriz em python:
Por favor, sugira se eu perdi alguma coisa.
fonte