Solución:
Tienes el modelo mental equivocado para usar NumPy de manera eficiente. Las matrices NumPy se almacenan en bloques contiguos de memoria. Si desea agregar filas o columnas a una matriz existente, la matriz completa debe copiarse en un nuevo bloque de memoria, creando espacios para que se almacenen los nuevos elementos. Esto es muy ineficaz si se hace repetidamente para construir una matriz.
En el caso de agregar filas, su mejor opción es crear una matriz que sea tan grande como su conjunto de datos eventualmente será, y luego asignarle 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.]])
Una matriz NumPy es una estructura de datos muy diferente de una lista y está diseñada para usarse de diferentes maneras. Tu uso de hstack
es potencialmente muy ineficiente … cada vez que lo llama, todos los datos de la matriz existente se copian en una nueva. (Los append
La función tendrá el mismo problema.) Si desea construir su matriz una columna a la vez, lo mejor sería mantenerla en una lista hasta que esté terminada, y solo entonces convertirla en una matriz.
p.ej
mylist = []
for item in data:
mylist.append(item)
mat = numpy.array(mylist)
item
puede ser una lista, una matriz o cualquier iterable, siempre que cada item
tiene el mismo número de elementos.
En este caso particular (data
es algo iterable sosteniendo las columnas de la matriz) simplemente puede usar
mat = numpy.array(data)
(También tenga en cuenta que el uso de list
como nombre de variable probablemente no sea una buena práctica, ya que enmascara el tipo incorporado con ese nombre, lo que puede provocar errores).
EDITAR:
Si por alguna razón realmente desea crear una matriz vacía, puede usar numpy.array([])
, ¡pero esto rara vez es útil!
Para crear una matriz multidimensional vacía en NumPy (por ejemplo, una matriz 2D m*n
para almacenar su matriz), en caso de que no sepa m
cuántas filas agregará y no le importa el costo computacional que mencionó Stephen Simmons (es decir, reconstruir la matriz en cada agregado), puede comprimir a 0 la dimensión a la que desea agregar: X = np.empty(shape=[0, n])
.
De esta manera puede usar, por ejemplo (aquí m = 5
que asumimos que no sabíamos al crear la matriz vacía, y n = 2
):
import numpy as np
n = 2
X = np.empty(shape=[0, n])
for i in range(5):
for j in range(2):
X = np.append(X, [[i, j]], axis=0)
print X
que te dará:
[[ 0. 0.]
[ 0. 1.]
[ 1. 0.]
[ 1. 1.]
[ 2. 0.]
[ 2. 1.]
[ 3. 0.]
[ 3. 1.]
[ 4. 0.]
[ 4. 1.]]