¿Hay alguna forma de inicializar una matriz numpy de una forma y agregarla? Explicaré lo que necesito con un ejemplo de lista. Si quiero crear una lista de objetos generados en un bucle, puedo hacer:
a = []
for i in range(5):
a.append(i)
Quiero hacer algo similar con una matriz numpy. Sé sobre vstack, concatenate, etc. Sin embargo, parece que estos requieren dos matrices numpy como entradas. Lo que necesito es:
big_array # Initially empty. This is where I don't know what to specify
for i in range(5):
array i of shape = (2,4) created.
add to big_array
El big_array
debería tener una forma (10,4)
. ¿Como hacer esto?
EDITAR:
Quiero agregar la siguiente aclaración. Soy consciente de que puedo definir big_array = numpy.zeros((10,4))
y luego llenarlo. Sin embargo, esto requiere especificar el tamaño de big_array de antemano. Sé el tamaño en este caso, pero ¿y si no lo sé? Cuando usamos la .append
función para extender la lista en Python, no necesitamos saber su tamaño final de antemano. Me pregunto si existe algo similar para crear una matriz más grande a partir de matrices más pequeñas, comenzando con una matriz vacía.
[i for i in range(5)]
. (Equivalentementelist(range(5))
, aunque este es un ejemplo artificial.)x = numpy.array()
lo haríamos con una lista comoy = []
; pero no funcionóRespuestas:
o
o
Sin embargo, la mentalidad en la que construimos una matriz agregando elementos a una lista no se usa mucho en numpy, porque es menos eficiente (los tipos de datos numpy están mucho más cerca de las matrices C subyacentes). En su lugar, debe preasignar la matriz al tamaño que necesita, y luego completar las filas. Sin
numpy.append
embargo, puedes usarlo si es necesario.fuente
append
en numpy. Es solo que es menos eficiente no preasignar (en este caso, mucho menos eficiente, ya queappend
ing copia la matriz completa cada vez), por lo que no es una técnica estándar.np.empty
matriz está llena de valores? ¿Qué pasa con los artículos "vacíos" restantes?np.concatenate()
), puede inicializar con:np.empty((0, some_width))
. 0, por lo que su primera matriz no será basura.La forma en que generalmente hago eso es creando una lista regular, luego agrego mis cosas en ella y finalmente transformo la lista en una matriz numpy de la siguiente manera:
por supuesto, su objeto final ocupa el doble de espacio en la memoria en el paso de creación, pero agregar en la lista de Python es muy rápido, y la creación usando np.array () también.
fuente
Introducido en numpy 1.8:
Ejemplos:
fuente
Matriz análoga para el pitón
es:
fuente
empty((0))
inicializa una matriz numpy.numpy.fromiter()
es lo que buscas:También funciona con expresiones generadoras, por ejemplo:
Si conoce de antemano la longitud de la matriz, puede especificarla con un argumento opcional de 'conteo'.
fuente
Desea evitar los bucles explícitos tanto como sea posible al hacer la computación en matriz, ya que eso reduce la ganancia de velocidad de esa forma de computación. Hay varias formas de inicializar una matriz numpy. Si quieres que esté lleno de ceros, haz lo que dijo katrielalex:
big_array = numpy.zeros((10,4))
EDITAR: ¿Qué tipo de secuencia estás haciendo? Debe consultar las diferentes funciones numpy que crean matrices, como
numpy.linspace(start, stop, size)
(número igualmente espaciado) onumpy.arange(start, stop, inc)
. Donde sea posible, estas funciones harán que los arreglos sean sustancialmente más rápidos que hacer el mismo trabajo en bucles explícitosfuente
Para su primer ejemplo de matriz use,
Para inicializar big_array, use
Esto supone que desea inicializar con ceros, lo cual es bastante típico, pero hay muchas otras formas de inicializar una matriz en numpy .
Editar: si no conoce el tamaño de big_array de antemano, generalmente es mejor construir primero una lista de Python usando append, y cuando tenga todo recogido en la lista, convierta esta lista en una matriz numpy usando
numpy.array(mylist)
. La razón de esto es que las listas están destinadas a crecer de manera muy eficiente y rápida, mientras que numpy.concatenate sería muy ineficiente ya que las matrices numpy no cambian de tamaño fácilmente. Pero una vez que todo se recopila en una lista, y conoce el tamaño final de la matriz, se puede construir una matriz numpy de manera eficiente.fuente
Para inicializar una matriz numpy con una matriz específica:
salida:
fuente
Siempre que se encuentre en la siguiente situación:
y desea algo similar en numpy, varias respuestas anteriores han señalado formas de hacerlo, pero como señaló @katrielalex, estos métodos no son eficientes. La manera eficiente de hacer esto es crear una lista larga y luego volver a darle la forma que desee después de tener una lista larga. Por ejemplo, digamos que estoy leyendo algunas líneas de un archivo y cada fila tiene una lista de números y quiero construir una matriz de forma numpy (número de líneas leídas, longitud del vector en cada fila). Así es como lo haría de manera más eficiente:
fuente
Me doy cuenta de que esto es un poco tarde, pero no noté ninguna de las otras respuestas que mencionan la indexación en la matriz vacía:
De esta manera, preasigna toda la matriz de resultados con
numpy.empty
y completa las filas a medida que avanza utilizando la asignación indexada.Es perfectamente seguro preasignar en
empty
lugar dezeros
en el ejemplo que dio, ya que garantiza que todo el conjunto se llenará con los fragmentos que genere.fuente
Sugeriría definir la forma primero. Luego itere sobre él para insertar valores.
fuente
Tal vez algo como esto se ajuste a tus necesidades.
Que produce el siguiente resultado
fuente