220 votos

¿Cómo creo un Array/matriz vacío en NumPy?

Estoy seguro de que debo ser muy tonto, pero no puedo averiguar cómo usar un Array o una matriz de la forma en que normalmente usaría una lista. Es decir, quiero crear un Array (o matriz) vacío y luego agregarle una columna (o fila) a la vez.

Por el momento la única manera que puedo encontrar para hacer esto es como:

mat = None
for col in columns:
    if mat is None:
        mat = col
    else:
        mat = hstack((mat, col))

Mientras que si fuera una lista, haría algo como esto:

list = []
for item in data:
    list.append(item)

¿Hay alguna manera de usar ese tipo de notación para NumPy ¿arreglos o matrices? (O una mejor manera ¡Todavía soy bastante nuevo en Python!)

317voto

Stephen Simmons Puntos 1921

Tienes el modelo mental equivocado para usar NumPy eficientemente. Las matrices de NumPy se almacenan en bloques de memoria contiguos. Si quieres añadir filas o columnas a una matriz existente, la matriz entera debe ser copiada a un nuevo bloque de memoria, creando huecos para los nuevos elementos a ser almacenados. Esto es muy ineficiente si se hace repetidamente para construir un Array.

En el caso de añadir filas, su mejor apuesta es crear un Array que sea tan grande como lo será eventualmente su conjunto de datos, y luego añadirle datos fila por fila:

>>> import numpy
>>> a = numpy.zeros(shape=(5,2))
>>> a
array([[ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.]])
>>> a[0] = [1,2]
>>> a[1] = [2,3]
>>> a
array([[ 1.,  2.],
   [ 2.,  3.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.]])

74voto

Greg Ball Puntos 970

Una matriz de NumPy es una estructura de datos muy diferente a la de una lista y está diseñada para ser usada de diferentes maneras. Su uso de hstack es potencialmente muy ineficiente... cada vez que lo llamas, todos los datos del Array existente se copian en uno nuevo. (El append función tendrá el mismo problema). Si quieres construir tu matriz una columna a la vez, sería mejor que la mantuvieras en una lista hasta que esté terminada, y sólo entonces convertirla en una matriz.

por ejemplo.

mylist = []
for item in data:
    mylist.append(item)
mat = numpy.array(mylist)

item puede ser una lista, una matriz o cualquier cosa iterable, siempre y cuando como cada uno item tiene el mismo número de elementos.
En este caso particular ( data es algo iterable que sostiene las columnas de la matriz) puedes usar simplemente

mat = numpy.array(data)

(Obsérvese también que el uso de list como un nombre de variable probablemente no es una buena práctica ya que enmascara el tipo incorporado por ese nombre, lo que puede llevar a los bichos).

EDITAR:

Si por alguna razón realmente quieres crear un Array vacío, puedes usar numpy.array([]) pero esto es raramente útil!

20voto

Andrei Paga Puntos 21

Investigué mucho sobre esto porque necesitaba usar un numpy.array como set en uno de mis proyectos escolares y necesitaba ser inicializado vacío... No encontré ninguna respuesta relevante aquí en Stack Overflow, así que empecé a garabatear algo.

# Initialize your variable as a empty list first
In [32]: x=[]
# and now cast it as a numpy ndarray
In [33]: x=np.array(x)

El resultado será:

In [34]: x
Out[34]: array([], dtype=float64)

Por lo tanto, puede inicializar directamente una matriz np de la siguiente manera:

In [36]: x= np.array([], dtype=np.float64)

Espero que esto ayude.

6voto

Il-Bhima Puntos 5757

Puede utilizar la función de apéndice. Para las filas:

>>> from numpy import *
>>> a = array([10,20,30])
>>> append(a, [[1,2,3]], axis=0)
array([[10, 20, 30],      
       [1, 2, 3]])

Para las columnas:

>>> append(a, [[15],[15]], axis=1)
array([[10, 20, 30, 15],      
       [1, 2, 3, 15]])

EDITAR
Por supuesto, como se mencionó en otras respuestas, a menos que estés haciendo algún tipo de procesamiento (ej. inversión) en la matriz/arreglo CADA vez que le añadas algo, yo sólo crearía una lista, la añadiría y luego la convertiría en un arreglo.

3voto

cyborg Puntos 5463

Si no sabes en absoluto el tamaño final del Conjunto, puedes incrementar el tamaño del Conjunto así:

my_arr = numpy.zeros((0,5))
for i in range(3):
    my_arr=numpy.concatenate( ( my_arr, numpy.ones((1,5)) ) )
print(my_arr)

[[ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]]
  • Fíjate en el 0 en la primera línea.
  • numpy.append es otra opción. Llama numpy.concatenate .

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X