2009-12-15 29 views
6

Hola tengo una serie de datos de 1000 con 1500 puntos en cada uno.¿Cómo agrego filas y columnas a una matriz NUMPY?

Forman una matriz Numpy de tamaño (1000x1500) creada con np.zeros ((1500, 1000)) y luego se rellenan con los datos.

Ahora, ¿y si quiero que la matriz crezca para decir 1600 x 1100? ¿Debo agregar arreglos utilizando hstack y vstack o hay una forma mejor?

Me gustaría que los datos que ya están en la pieza de 1000x1500 de la matriz no se cambien, solo los datos en blanco (ceros) se agregan a la parte inferior y derecha, básicamente.

Gracias.

Respuesta

3

Si quiere ceros en los elementos agregados, my_array.resize((1600, 1000)) debería funcionar. Tenga en cuenta que esto difiere de numpy.resize(my_array, (1600, 1000)), en el que las líneas anteriores están duplicadas, que probablemente no sea lo que usted desea.

De lo contrario (por ejemplo, si desea evitar inicializar elementos a cero, lo que podría ser innecesario), puede utilizar hstack y vstack para agregar una matriz que contenga los nuevos elementos; numpy.concatenate() (ver pydoc numpy.concatenate) debería funcionar también (es más general, por lo que yo entiendo).

En cualquier caso, supongo que se debe asignar un nuevo bloque de memoria para extender la matriz, y que todos estos métodos tardan aproximadamente el mismo tiempo.

+0

Solo tenga en cuenta que esto no parece mantener los datos en su lugar en el caso cuando simplemente desea extender el conjunto de datos: >>> a = numpy.array ([[1,2], [ 3,4]]) >>> a array ([[1, 2], [3, 4]]) >>> a.resize ((2,4)) Traceback (última llamada fue la última)): Archivo "", línea 1, en ValueError: no se puede cambiar el tamaño de una matriz de referencias o se hace referencia por otra matriz de esta manera. Utilice la función de cambio de tamaño >>> a = numpy.array (a) >>> a.resize ((2,4)) >>> a array ([[1, 2, 3, 4], [0, 0, 0, 0]]) – mathtick

0

Debe usar reshape() y/o resize() dependiendo de su requerimiento exacto.

Si desea capítulos y versículos de los autores, es mejor que los publique en el numpy panel de discusión.

7

Esto debería hacer lo que quiera (es decir, usando matriz de 3x3 y la matriz 4x4 para representar las dos matrices en el OP)

>>> import numpy as NP 
>>> a = NP.random.randint(0, 10, 9).reshape(3, 3) 
>>> a 
>>> array([[1, 2, 2], 
      [7, 0, 7], 
      [0, 3, 0]]) 

>>> b = NP.zeros((4, 4)) 

mapeo una a b:

>>> b[:3,:3] = a 

>>> b 
    array([[ 1., 2., 2., 0.], 
      [ 7., 0., 7., 0.], 
      [ 0., 3., 0., 0.], 
      [ 0., 0., 0., 0.]]) 
+0

Recibí un error de ese código. ¿No debería la última línea ser b [: 3,: 3] = a?De todos modos, más uno ya que cuando lo hice funcionó y eso es lo que estaba buscando. –

+0

@ kηives sí, un error tipográfico, gracias, editando mi publicación ahora. – doug

2

No importa qué, estarás atascado reasignando un trozo de memoria, por lo que en realidad no importa si usas arr.resize(), np.concatenate , hstack/vstack, etc. Tenga en cuenta que si está acumulando una gran cantidad de datos secuencialmente, las listas de Python suelen ser más eficientes.

Cuestiones relacionadas