HOWTO · Python
Copie un array 2D en Python
Este artículo demuestra cómo hacer una copia de un array 2D en Python
En esta página
Para copiar datos 2D en Python, elige la operación según el tipo de datos y cómo quieras compartirlos: usa copy() de NumPy para obtener datos de array independientes, copy.deepcopy() para copiar una lista anidada cuyas listas internas también deban ser independientes, o una copia superficial si quieres compartir los objetos internos. Un view() de NumPy es un objeto array distinto que comparte sus datos subyacentes con el original.
Un array 2D organiza los valores en filas y columnas. En una lista de listas de Python, cada lista interna representa una fila; dos índices permiten seleccionar una fila y luego un elemento de esa fila, como en data[row_index][column_index].
Crear una copia de arrays 2D con el método copy() de NumPy
Para un ndarray de NumPy, llama a su método copy() para crear un array con datos propios. Este ejemplo cambia un valor de la copia y luego consulta ambos arrays:
import numpy as np
original = np.array([[23, 34, 45], [24, 45, 78]])
copied = original.copy()
copied[0, 2] = 65
print("Copy:", copied.tolist())
print("Original:", original.tolist())
Copy: [[23, 34, 65], [24, 45, 78]]
Original: [[23, 34, 45], [24, 45, 78]]
La asignación modifica copied; el array original conserva sus valores iniciales. Esta es la opción directa cuando necesitas editar datos numéricos del array de forma independiente. En la salida, las etiquetas “Copy:” y “Original:” permanecen en inglés: la primera señala los valores de la copia y la segunda, los del array original. Los arrays de NumPy también pueden contener objetos de Python; al copiar un array de tipo object, se copia el búfer de datos del array, pero no se copian recursivamente los objetos de Python que contiene.
Crear una copia de un array 2D con la función copy.deepcopy()
Para una lista anidada de Python, copy.deepcopy() copia recursivamente las listas y su contenido. Esto resulta útil cuando es posible que se modifique una lista interna después de copiarla:
import copy
original = [["red", "blue"], ["green", "gold"]]
copied = copy.deepcopy(original)
copied[0].append("white")
print("Copy:", copied)
print("Original:", original)
Copy: [['red', 'blue', 'white'], ['green', 'gold']]
Original: [['red', 'blue'], ['green', 'gold']]
La nueva lista externa y sus listas internas son independientes de las originales, por lo que añadir un elemento a una lista interna de copied deja original sin cambios. deepcopy() es útil para datos mutables anidados; con objetos grandes o personalizados, conviene considerar si es apropiado copiar recursivamente cada objeto referenciado.
Crear una copia superficial de un array 2D en Python
Una copia superficial crea un contenedor externo nuevo, pero conserva las referencias a los objetos internos del original. En una lista anidada, copy.copy() y el método list.copy() del contenedor externo se comportan así:
import copy
original = [["red", "blue"], ["green", "gold"]]
copied = copy.copy(original)
copied[0].append("white")
print("Copy:", copied)
print("Original:", original)
Copy: [['red', 'blue', 'white'], ['green', 'gold']]
Original: [['red', 'blue', 'white'], ['green', 'gold']]
En este caso, ambas listas externas hacen referencia a la misma primera lista interna, por lo que el elemento añadido se ve a través de las dos. Si reemplazas un elemento de la lista externa copiada, por ejemplo con copied[0] = ["black"], solo cambias la referencia de esa lista externa. Usa copy.deepcopy() si también necesitas que las listas internas sean independientes.
El view() de NumPy es una operación distinta de una copia superficial de una lista anidada de Python. Devuelve un objeto ndarray distinto que comparte los datos del array original, así que una asignación a través de la vista también cambia los valores que se ven en el original. Para obtener datos de NumPy independientes, usa ndarray.copy(). La identidad de los objetos y el uso compartido de datos son cuestiones distintas: dos arrays pueden ser objetos diferentes y, aun así, exponer los mismos valores subyacentes.
import numpy as np
original = np.array([[24, 23, 25], [32, 43, 54]])
view = original.view()
view[0, 2] = 100
print("View:", view.tolist())
print("Original:", original.tolist())
View: [[24, 23, 100], [32, 43, 54]]
Original: [[24, 23, 100], [32, 43, 54]]