HOWTO · Python

Como iniciar a array 2-D em Python

Este tutorial introduz como iniciar a array 2-D

Este guia tutorial irá introduzir diferentes métodos para iniciar um array 2-D em Python. Vamos fazer um array 3x5 2-D nos seguintes exemplos.

Método de compreensão de lista para iniciar um array 2D

>>> 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]]

Este método de compreensão de lista aninhada cria um array 2-D com o valor inicial como 0. Claro, você pode alterar o valor inicial para qualquer valor que você precise atribuir em sua aplicação.

Método de range aninhado para iniciar um array 2D

Se você não se importa com o valor inicial no array 2-D, o valor 0 pode até ser eliminado.

Em 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]]

Em Python 3.x

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

Nós não poderíamos simplesmente utilizar range(x) para iniciar o array 2-D em Python 3.x porque range retorna um objeto contendo uma seqüência de inteiros em Python 3.x, mas não uma lista de inteiros como em Python 2.x.

range em Python 3.x é mais similar ao xrange em Python 2.x. O objeto range em Python 3.x é imutável, portanto, você não atribui itens aos seus elementos.

Se você precisa de atribuição de itens, você precisa converter o objeto range para o objeto 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] * método n para iniciar um array 2D

Uma forma pitônica de iniciar um array 2-D poderia ser

>>> 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]]

Embora devamos ser cautelosos quando usamos multiplicação de lista porque ela simplesmente cria uma seqüência com múltiplas referências a um mesmo objeto, estamos aliviados em usar [0]*n aqui porque o objeto de dados 0 é imutável para que nunca encontremos problemas mesmo com referências ao mesmo objeto imutável.

Método NumPy para iniciar um array 2D

Além da array nativa Python, NumPy deve ser a melhor opção para criar uma array 2D, ou para ser mais preciso, uma array.

Você poderia criar uma array cheia de zeros com 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.]])

Ou iniciar uma array preenchida com ones com 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.]])

Você poderia até criar um novo array sem inicializar as entradas com 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]])
Notas
É uma solução melhor se você quiser criar primeiro a array vazia e depois atribuir os valores dos elementos mais tarde. Mas esteja ciente de que valores aleatórios estão no array para que possa ser arriscado se você acessar o array através da indexação antes que o valor do índice correspondente tenha sido atribuído.