Como declarar uma matriz em Python?


491

Como declaro uma matriz em Python ?

Não consigo encontrar nenhuma referência a matrizes na documentação.


121
Por alguma razão insondável, o Python chama matrizes de "listas". A escola de design de idiomas "todo mundo sabe o que é isso que se chama assim que vamos chamar de algo mais". É uma escolha de nome particularmente ruim, pois parece uma lista vinculada e não uma matriz.
Glenn Maynard

42
@ Glenn Maynard: provavelmente porque em linguagens tipo C as matrizes são de tamanho fixo, enquanto as listas Python não. É mais como o vetor STL em C ++ ou ArrayList em Java.
MAK

128
É chamado de lista, porque é uma lista. [A (), 1, 'Foo', u'öäöäö ', 67L, 5,6]. Uma lista. Uma matriz é "um arranjo de itens em endereços igualmente espaçados na memória do computador" (wikipedia).
Lennart Regebro 03/10/2009

35
Nada sobre o termo universalmente entendido "matriz" sugere um comprimento fixo ou qualquer coisa sobre o conteúdo; essas são apenas limitações da implementação específica de matrizes de C. As listas Python são igualmente espaçadas (ponteiros para objetos, internamente), ou então __getitem__não seriam O (1).
Glenn Maynard

24
@Glenn, de en.wikipedia.org/wiki/Array_data_structure: "os elementos de uma estrutura de dados de matriz precisam ter o mesmo tamanho" (verdadeiro para matrizes de Python, não verdadeiro para listas de Python) e "conjunto de tuplas de índice válidas e os endereços dos elementos (e, portanto, a fórmula de endereçamento dos elementos) geralmente são fixos enquanto a matriz está em uso "(não é verdade no Python para lista ou matriz).
287 Alex Martelli

Respostas:


358
variable = []

Agora variablese refere a uma lista vazia * .

Claro que isso é uma tarefa, não uma declaração. Não há como dizer no Python "essa variável nunca deve se referir a nada além de uma lista", pois o Python é digitado dinamicamente.


* O tipo Python interno padrão é chamado de lista , não uma matriz. É um contêiner ordenado de comprimento arbitrário que pode conter uma coleção heterogênea de objetos (seus tipos não importam e podem ser livremente misturados). Isso não deve ser confundido com o arraymódulo , que oferece um tipo mais próximo do arraytipo C ; o conteúdo deve ser homogêneo (do mesmo tipo), mas o comprimento ainda é dinâmico.


11
Seria possível inicializar o conteúdo da matriz, como no JavaScript? (por exemplo, como variable = ["Hi", "Hello"];?)
Anderson Green

6
@AndersonGreen Sim.
sepp2k

3
Como você declarar uma matriz multidimensional, em seguida, (por exemplo, uma matriz 2D?)
Anderson Verde

7
@AndersonGreen Como eu disse, não existe uma declaração de variável em Python. Você poderia criar uma lista multidimensional, tendo uma lista vazia e colocando outras listas no seu interior ou, se as dimensões da lista são conhecidos no write-tempo, você poderia apenas escrevê-lo como um literal como este: my_2x2_list = [[a, b], [c, d]]. Dependendo do que você precisa de matrizes multidimensionais, você também pode considerar o uso numpy, que define os tipos de matrizes para matrizes multidimensionais, homogêneas e sem caixa, que podem ser muito mais eficientes quando aplicável, portanto, são preferíveis para cálculos numéricos.
sepp2k

1
@IfanIqbal Sim, se contiver pelo menos um elemento, você poderá.
sepp2k

136

Este é um tópico surpreendentemente complexo em Python.

Resposta prática

Matrizes são representadas por classe list(consulte a referência e não as misture com geradores ).

Confira exemplos de uso:

# empty array
arr = [] 

# init with values (can contain mixed types)
arr = [1, "eels"]

# get item by index (can be negative to access end of array)
arr = [1, 2, 3, 4, 5, 6]
arr[0]  # 1
arr[-1] # 6

# get length
length = len(arr)

# supports append and insert
arr.append(8)
arr.insert(6, 7)

Resposta teórica

Sob o capô, o Python's listé um invólucro para uma matriz real que contém referências a itens. Além disso, a matriz subjacente é criada com algum espaço extra.

As consequências disso são:

  • acesso aleatório é muito barato ( arr[6653]é o mesmo que arr[0])
  • append operação é "de graça", enquanto algum espaço extra
  • insert operação é cara

Verifique esta impressionante tabela de complexidade de operações .

Além disso, veja esta imagem, onde tentei mostrar as diferenças mais importantes entre matriz, matriz de referências e lista vinculada: matrizes, matrizes em todos os lugares


5
Só para acrescentar, há uma maneira muito legal de matrizes de corte em python: para [1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]resultado será[2, 3, 4, 5, 6, 7]
Anton Purin

2
Vejo alguns votos negativos para este post de tempos em tempos. Seria ótimo se alguém pudesse postar uma palavra do porquê. Obrigado.
Anton Purin

2
Você é um verdadeiro MVP. É necessário conhecer o design real escolhido da 'lista' para tomar decisões de programação razoáveis. Basicamente, é como um 'vetor' em C ++. Obrigado!
Necro

Esta é uma resposta muito longa, com uma ótima explicação!
Ahmed

Posso adicionar a notação prática para comparação, por exemplo: a == b[:2]retorna True se os 2 primeiros elementos de b forem iguais aos valores da matriz a
Bruno L.

124

Na verdade, você não declara as coisas, mas é assim que você cria uma matriz no Python:

from array import array
intarray = array('i')

Para mais informações, consulte o módulo de matriz: http://docs.python.org/library/array.html

Agora é possível que você não queira uma matriz, mas uma lista, mas outras pessoas já responderam isso. :)


10
Isso é meio engraçado, mas não é realmente uma boa resposta para uma pergunta marcada como "iniciante". Apenas para esclarecer: no Python você costuma usar um tipo de dados chamado a list. O Python possui um tipo de dados para fins especiais chamado an, arrayque se parece mais com uma matriz C e é pouco usado.
Steveha 4/10/09

63
Não, mas todo mundo já usou uma lista. Eu pensei que seria uma boa resposta ressaltar que também existem matrizes.
Lennart Regebro 04/10/2009

8
adereços super loucos para esta resposta. Venho programando em Python há anos e só recentemente percebi que havia um objeto de matriz Python real que é diferente dos objetos de lista. Embora a estrutura de dados seja muito semelhante, as matrizes limitam que tipo de objetos a matriz pode conter. Ótima resposta @LennartRegebro!
21415 Josh Brown

4
Esta deve ser a Lista resposta certa e Arrays são duas coisas diferentes @LennartRegebro graças
Mina Gabriel

Há um motivo específico para você querer usar matrizes em vez de listas. Especificamente, se você tiver uma matriz chamada myarray cheia de números, poderá executar operações matemáticas contra ela, e essas operações serão aplicadas a todos os itens dentro dela. Portanto, se você executar myarray / 3, todo número interno será dividido por 3. Se você tentar fazer o mesmo com uma lista, receberá um erro. Portanto, matrizes são mais eficientes para grandes conjuntos de dados de números.
Matthew

66

Eu acho que você quer dizer uma lista com as 30 primeiras células já preenchidas. assim

   f = []

   for i in range(30):
       f.append(0)

Um exemplo de onde isso poderia ser usado está na sequência de Fibonacci. Veja o problema 2 no Projeto Euler


96
Essa é uma maneira bastante barroca de inicializar uma lista. Tente em f = [0] * 30vez disso.
precisa

Não é o mesmo que a = range (10) de @slehar anwer? Amo python, é sintaxe e é Zen.
M3nda

@ erm3nda nope: $ python3 Python 3.4.2 [...] >>> a = range (10) >>> print (a) range (0, 10) >>>
arp

37

É assim:

my_array = [1, 'rebecca', 'allard', 15]

4
Como essa não é uma matriz python, mas uma lista python, não seria menos confuso chamá-la "my_list"?
Mattis Asp

4
Isso cria uma lista, não uma matriz. Eles são diferentes e têm propriedades diferentes em python. Especificamente, você pode executar operações numéricas em uma matriz, mas não em uma lista.
Matthew

21

Para cálculos, use matrizes numpy como este:

import numpy as np

a = np.ones((3,2))        # a 2D array with 3 rows, 2 columns, filled with ones
b = np.array([1,2,3])     # a 1D array initialised using a list [1,2,3]
c = np.linspace(2,3,100)  # an array with 100 points beteen (and including) 2 and 3

print(a*1.5)  # all elements of a times 1.5
print(a.T+b)  # b added to the transpose of a

essas matrizes numpy podem ser salvas e carregadas do disco (mesmo compactadas) e cálculos complexos com grandes quantidades de elementos são rápidos como C.

Muito usado em ambientes científicos. Veja aqui para mais.


17

O comentário de JohnMachin deve ser a resposta real. Todas as outras respostas são apenas soluções alternativas na minha opinião! Assim:

array=[0]*element_count

aceita. exceto o cuidado de chamar até a variável "array" ou obter ira purista. para isso eu também acrescentaria que você também pode criar "matrizes multidimensionais":x=[[0] * 10] * 10
Peter S Magnusson

17

Algumas contribuições sugeriram que matrizes em python são representadas por listas. Isto está incorreto. O Python possui uma implementação independente array()no array " array.array()" módulo de biblioteca padrão, portanto, é incorreto confundir os dois. As listas são listas em python, portanto, tenha cuidado com a nomenclatura usada.

list_01 = [4, 6.2, 7-2j, 'flo', 'cro']

list_01
Out[85]: [4, 6.2, (7-2j), 'flo', 'cro']

Há uma diferença muito importante entre lista e array.array(). Enquanto esses dois objetos são seqüências ordenadas, array.array () é uma sequência homogênea ordenada, enquanto uma lista é uma sequência não homogênea.


16

Você não declara nada no Python. Você apenas usa. Eu recomendo que você comece com algo como http://diveintopython.net .


2
Algumas vezes você deve declarar o tipo de uma variável: se você não a usa antes, uma estrutura de controle, ela não existe fora da estrutura de controle e você estará construindo uma nova variável. A suposição é que a variável é um int, que entra em conflito se você a usar como um tipo mais complexo.
mais claro

@ Clearer sim, o uso de funções às vezes precisa declará-lo e, às vezes, reproduzir alguns globais ao usar funções e não quero escrever muitos argumentos sobre as funções.
M3nda

Não é apenas função; uma simples declaração if poderia lhe dar o mesmo problema.
Clearer

1
Programar é sobre declarar, não importa qual idioma você usa. Tipo declarar é uma história completamente diferente
Outside_Box 15/08/18

Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada.
Adrian Tompkins


11

Para adicionar à resposta de Lennart, uma matriz pode ser criada assim:

from array import array
float_array = array("f",values)

onde os valores podem assumir a forma de uma tupla, lista ou np.array, mas não uma matriz:

values = [1,2,3]
values = (1,2,3)
values = np.array([1,2,3],'f')
# 'i' will work here too, but if array is 'i' then values have to be int
wrong_values = array('f',[1,2,3])
# TypeError: 'array.array' object is not callable

e a saída ainda será a mesma:

print(float_array)
print(float_array[1])
print(isinstance(float_array[1],float))

# array('f', [1.0, 2.0, 3.0])
# 2.0
# True

A maioria dos métodos de lista também funciona com array, sendo os comuns pop (), extend () e append ().

A julgar pelas respostas e comentários, parece que a estrutura de dados da matriz não é tão popular. Eu gosto, porém, da mesma maneira que se pode preferir uma tupla a uma lista.

A estrutura da matriz possui regras mais rígidas que uma lista ou np.array, e isso pode reduzir erros e facilitar a depuração, especialmente ao trabalhar com dados numéricos.

Tentativas de inserir / acrescentar um ponto flutuante a uma matriz int lançarão um TypeError:

values = [1,2,3]
int_array = array("i",values)
int_array.append(float(1))
# or int_array.extend([float(1)])

# TypeError: integer argument expected, got float

Manter valores que devem ser números inteiros (por exemplo, lista de índices) no formato de matriz pode, portanto, impedir um "TypeError: os índices de lista devem ser números inteiros, não flutuantes", pois as matrizes podem ser iteradas, semelhante a np.array e lists:

int_array = array('i',[1,2,3])
data = [11,22,33,44,55]
sample = []
for i in int_array:
    sample.append(data[i])

Irritantemente, anexar um int a uma matriz flutuante fará com que o int se torne um flutuante, sem gerar uma exceção.

O np.array também retém o mesmo tipo de dados para suas entradas, mas em vez de dar um erro, ele mudará seu tipo de dados para ajustar novas entradas (geralmente para double ou str):

import numpy as np
numpy_int_array = np.array([1,2,3],'i')
for i in numpy_int_array:
    print(type(i))
    # <class 'numpy.int32'>
numpy_int_array_2 = np.append(numpy_int_array,int(1))
# still <class 'numpy.int32'>
numpy_float_array = np.append(numpy_int_array,float(1))
# <class 'numpy.float64'> for all values
numpy_str_array = np.append(numpy_int_array,"1")
# <class 'numpy.str_'> for all values
data = [11,22,33,44,55]
sample = []
for i in numpy_int_array_2:
    sample.append(data[i])
    # no problem here, but TypeError for the other two

Isso também ocorre durante a atribuição. Se o tipo de dados for especificado, o np.array, sempre que possível, transformará as entradas nesse tipo de dados:

int_numpy_array = np.array([1,2,float(3)],'i')
# 3 becomes an int
int_numpy_array_2 = np.array([1,2,3.9],'i')
# 3.9 gets truncated to 3 (same as int(3.9))
invalid_array = np.array([1,2,"string"],'i')
# ValueError: invalid literal for int() with base 10: 'string'
# Same error as int('string')
str_numpy_array = np.array([1,2,3],'str')
print(str_numpy_array)
print([type(i) for i in str_numpy_array])
# ['1' '2' '3']
# <class 'numpy.str_'>

ou, em essência:

data = [1.2,3.4,5.6]
list_1 = np.array(data,'i').tolist()
list_2 = [int(i) for i in data]
print(list_1 == list_2)
# True

enquanto array simplesmente dará:

invalid_array = array([1,2,3.9],'i')
# TypeError: integer argument expected, got float

Por esse motivo, não é uma boa ideia usar o np.array para comandos específicos de tipo. A estrutura da matriz é útil aqui. lista preserva o tipo de dados dos valores.

E para algo que eu acho bastante incômodo: o tipo de dados é especificado como o primeiro argumento em array (), mas (geralmente) o segundo em np.array (). : |

A relação com C é referida aqui: Lista Python vs. Matriz - quando usar?

Divirta-se explorando!

Nota: A natureza tipificada e estrita da matriz se inclina mais para C do que para Python, e por design o Python não possui muitas restrições específicas de tipo em suas funções. Sua impopularidade também cria um feedback positivo no trabalho colaborativo, e sua substituição envolve principalmente um [int (x) adicional para x no arquivo]. Portanto, é inteiramente viável e razoável ignorar a existência de matriz. Isso não deve atrapalhar a maioria de nós de forma alguma. : D


8

Que tal agora...

>>> a = range(12)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> a[7]
6

6

Python os chama de listas . Você pode escrever uma lista literal entre colchetes e vírgulas:

>>> [6,28,496,8128]
[6, 28, 496, 8128]

5

Na sequência do Lennart, há também numpy que implementa homogêneos matrizes multi-dimensionais.


4

Eu tinha uma matriz de seqüências de caracteres e precisava de uma matriz do mesmo comprimento de booleanos iniciados em True. Foi o que eu fiz

strs = ["Hi","Bye"] 
bools = [ True for s in strs ]

Estou aqui porque queria a declaração C: int count[26]={0}; provavelmente existe uma maneira melhor, mas essa variante boolsacima funcionou. count=[0 for ii in range(26)]Depois, mudei para a count=[0]*26que parece preferível.
usar o seguinte comando

2

Você pode criar listas e convertê-las em matrizes ou criar matriz usando o módulo numpy. Abaixo estão alguns exemplos para ilustrar o mesmo. O Numpy também facilita o trabalho com matrizes multidimensionais.

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

#For custom inputs
a = np.array([int(x) for x in input().split()])

Você também pode remodelar essa matriz em uma matriz 2X2 usando a função remodelar, que recebe entradas como as dimensões da matriz.

mat = a.reshape(2, 2)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.