matriz matrices lista imprimir how dimensional defining create bidimensional array python arrays list

matrices - Asignar valor a una celda individual en una matriz de python bidimensional



python bidimensional arrays (7)

¿Por qué Python está inicializando el primer valor de cada matriz y no solo el primero?

Debido a que son la misma matriz, se hace referencia a varias veces.

¿Hay una mejor manera de lograr lo que estoy tratando de hacer?

Cree la estructura de manera que la matriz externa se refiera a matrices internas separadas en lugar de reutilizar una. Las otras respuestas proporcionan formas de hacerlo.

Esta pregunta ya tiene una respuesta aquí:

Digamos que tengo la siguiente matriz bidimensional vacía en Python:

q = [[None]*5]*4

Quiero asignar un valor de 5 a la primera fila en la primera columna de q . Instintivamente, hago lo siguiente:

q[0][0] = 5

Sin embargo, esto produce:

[[5, None, None, None, None], [5, None, None, None, None], [5, None, None, None, None], [5, None, None, None, None]]

El primer elemento de cada matriz se está inicializando a 5 , donde pensé que solo el primer elemento de la primera matriz obtendría la actualización. Tengo dos preguntas:

  1. ¿Por qué Python está inicializando el primer valor de cada matriz y no solo el primero?
  2. ¿Hay una mejor manera de lograr lo que estoy tratando de hacer?

En caso de que desee utilizar una lista y no un diccionario, como proponen los demás, puede utilizar esto:

q[0] = [5,None,None,None,None]


Esto no hace lo que esperabas.

q = [[None]*5]*4

Reutiliza objetos de la list varias veces. Como puede ver cuando realizó un cambio en una celda, que estaba en un objeto de lista reutilizada.

Una sola lista con un valor de [None] se usa cinco veces.

Una sola lista con un valor de [[None]*5] se usa cuatro veces.

q = [ [ None for i in range(5) ] for j in range(4) ]

Podría ser más lo que estás buscando.

Esto evita explícitamente la reutilización de un objeto de lista.

El 80% de las veces, un diccionario es lo que realmente querías.

q = {} q[0,0]= 5

También funcionará. No comienzas con una cuadrícula predefinida de valores None . Pero es raro que los necesites en primer lugar.

En Python 2.7 y superior, puedes hacer esto.

q = { (i,j):0 for i in range(5) for j in range(4) }

Eso construirá una cuadrícula indexada por 2-tuplas.

{(0, 1): 0, (1, 2): 0, (3, 2): 0, (0, 0): 0, (3, 3): 0, (3, 0): 0, (3, 1): 0, (2, 1): 0, (0, 2): 0, (2, 0): 0, (1, 3): 0, (2, 3): 0, (4, 3): 0, (2, 2): 0, (1, 0): 0, (4, 2): 0, (0, 3): 0, (4, 1): 0, (1, 1): 0, (4, 0): 0}


La razón por la que tienes la lista, ¡simplemente la duplicé cuatro veces! Python no regenera esa lista cada vez que lo haces *4 . Está utilizando el mismo objeto de lista.

Para evitar esto, necesitas forzar a python a volver a clasificar esa lista por ti cada vez que:

[ [None] * 5 for i1 in range(4) ]

En este caso, estoy usando una lista de comprensión.


La respuesta a la pregunta número 2: Usar numpy es una opción. Vea el siguiente código.

import numpy as np # creating 2D array with nans num_of_rows = 5 num_of_cols = 3 a = np.full((num_of_rows, num_of_cols), np.nan) #for zero vals: a = np.zeros((num_of_rows, num_of_cols)) # placing number 5 in row 3, col 1 value = [5] position_row = 3 position_col = 1 # the put command below flattens the 2D array position = [int(num_of_cols * position_row + position_col)] np.put(a, position, value)

resultado:

[[ nan nan nan] [ nan nan nan] [ nan nan nan] [ nan 5. nan] [ nan nan nan]]


La respuesta es simple. Nunca uses.

q = [[None]*5]*4

como cuando haces asignacion

q[0][1]=5 asigna valor varias veces a varias filas en 1 columna intente imprimir (q)

más bien usar

q = { (i,j):0 for i in range(5) for j in range(4) }

entonces q[0][1]=5 asignará una sola vez, intente

print(q)


q = [[None]*5]*4 print(q) q[1][1]=4 print(q) q = [ [ None for i in range(5) ] for j in range(4) ] q[1][1]=4 print(q)

resultado:

[[None, None, None, None, None], [None, None, None, None, None], [None, None, None, None, None], [None, None, None, None, None]] [[None, 4, None, None, None], [None, 4, None, None, None], [None, 4, None, None, None], [None, 4, None, None, None]] [[None, None, None, None, None], [None, 4, None, None, None], [None, None, None, None, None], [None, None, None, None, None]]