python - index - numpy array size
inicializar una matriz numpy (11)
¿Hay alguna manera 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 lo siguiente:
a = []
for i in range(5):
a.append(i)
Quiero hacer algo similar con una matriz numpy. Sé acerca de 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
debe 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 por adelantado. Sé el tamaño en este caso, pero ¿y si no? Cuando usamos la función .append
para extender la lista en python, no necesitamos saber su tamaño final por adelantado. 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.
Devuelve una nueva matriz de forma y tipo, llena de ceros.
o
Devuelve una nueva matriz de forma y tipo dados, rellenos con unos.
o
Devuelve una nueva matriz de forma y tipo dados, sin inicializar entradas.
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. numpy.append
embargo, puedes usar numpy.append
si es necesario.
Array analógico para el pitón
a = []
for i in range(5):
a.append(i)
es:
import numpy as np
a = np.empty((0))
for i in range(5):
a = np.append(a, i)
Desea evitar 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 se llene con ceros, haz lo que dijo katrielalex:
big_array = numpy.zeros((10,4))
EDITAR: ¿Qué tipo de secuencia estás haciendo? Debería verificar las diferentes funciones numpy que crean arrays, como numpy.linspace(start, stop, size)
(número igualmente espaciado), o numpy.arange(start, stop, inc)
. Siempre que sea posible, estas funciones harán que las matrices sean sustancialmente más rápidas que haciendo el mismo trabajo en bucles explícitos
Introducido en numpy 1.8:
Devuelve una nueva matriz de forma y tipo dados, rellenada con fill_value.
Ejemplos:
>>> import numpy as np
>>> np.full((2, 2), np.inf)
array([[ inf, inf],
[ inf, inf]])
>>> np.full((2, 2), 10)
array([[10, 10],
[10, 10]])
La forma en que generalmente lo hago es creando una lista regular, luego agrego mis cosas en ella y finalmente transformo la lista en una matriz numpy de la siguiente manera:
import numpy as np
big_array = [] # empty regular list
for i in range(5):
arr = i*np.ones((2,4)) # for instance
big_array.append(arr)
big_np_array = np.array(big_array) # transformed to a numpy array
por supuesto, su objeto final ocupa el doble de espacio en la memoria en el paso de creación, pero agregarlo a la lista de python es muy rápido y la creación también usa np.array ().
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:
big_array = numpy.empty(10, 4)
for i in range(5):
array_i = numpy.random.random(2, 4)
big_array[2 * i:2 * (i + 1), :] = array_i
De esta forma, numpy.empty
matriz de resultados completa con numpy.empty
y completa las filas a medida que numpy.empty
mediante la asignación indexada.
Es perfectamente seguro preasignar con empty
lugar de zeros
en el ejemplo que proporcionó, ya que garantiza que toda la matriz se llenará con los fragmentos que genere.
Para su primer ejemplo de uso de matriz,
a = numpy.arange(5)
Para inicializar big_array, use
big_array = numpy.zeros((10,4))
Esto supone que desea inicializar con ceros, que 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 crear primero una lista de Python usando append, y cuando tenga todo recogido en la lista, convierta esta lista a una matriz numpy.array(mylist)
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 usted conoce el tamaño final de la matriz, se puede construir eficientemente una matriz numpy.
Siempre que te encuentres en la siguiente situación:
a = []
for i in range(5):
a.append(i)
y quiere algo similar en numpy, varias respuestas anteriores han señalado maneras de hacerlo, pero como @katrielalex señaló que estos métodos no son eficientes. La forma más eficiente de hacerlo es crear una lista larga y luego darle nueva forma de 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 numpy de forma (número de líneas leídas, longitud del vector en cada fila). Así es como lo haría de manera más eficiente:
long_list = []
counter = 0
with open(''filename'', ''r'') as f:
for row in f:
row_list = row.split()
long_list.extend(row_list)
counter++
# now we have a long list and we are ready to reshape
result = np.array(long_list).reshape(counter, len(row_list)) # desired numpy array
Sugeriría definir la forma primero. A continuación, repítalo para insertar valores.
big_array= np.zeros(shape = ( 6, 2 ))
for it in range(6):
big_array[it] = (it,it) # For example
>>>big_array
array([[ 0., 0.],
[ 1., 1.],
[ 2., 2.],
[ 3., 3.],
[ 4., 4.],
[ 5., 5.]])
Tal vez algo así se ajuste a tus necesidades ...
import numpy as np
N = 5
res = []
for i in range(N):
res.append(np.cumsum(np.ones(shape=(2,4))))
res = np.array(res).reshape((10, 4))
print(res)
Que produce la siguiente salida
[[ 1. 2. 3. 4.]
[ 5. 6. 7. 8.]
[ 1. 2. 3. 4.]
[ 5. 6. 7. 8.]
[ 1. 2. 3. 4.]
[ 5. 6. 7. 8.]
[ 1. 2. 3. 4.]
[ 5. 6. 7. 8.]
[ 1. 2. 3. 4.]
[ 5. 6. 7. 8.]]
numpy.fromiter()
es lo que estás buscando:
big_array = numpy.fromiter(xrange(5), dtype="int")
También funciona con expresiones de generador, por ejemplo:
big_array = numpy.fromiter( (i*(i+1)/2 for i in xrange(5)), dtype="int" )
Si conoce la longitud de la matriz por adelantado, puede especificarla con un argumento opcional de "conteo".