2010-08-16 13 views
18

Soy nuevo en NumPy/SciPy. De la documentación, parece más eficiente preasignar una única matriz en lugar de llamar a anexar/insertar/concatenar.¿Cuál es la forma preferida de preasignar matrices NumPy?

Por ejemplo, para agregar una columna de 1 de a una matriz, creo que esto:

ar0 = np.linspace(10, 20, 16).reshape(4, 4) 
ar0[:,-1] = np.ones_like(ar0[:,0]) 

se prefiere a este:

ar0 = np.linspace(10, 20, 12).reshape(4, 3) 
ar0 = np.insert(ar0, ar0.shape[1], np.ones_like(ar0[:,0]), axis=1) 

mi primera pregunta es si esto es correcto (que la primera es mejor), y mi segunda pregunta es, por el momento, estoy preasignando mis matrices de esta manera (que noté en varios de los ejemplos de Cookbook en el sitio SciPy):

np.zeros((8,5)) 

¿cuál es la forma 'preferida de NumPy' para hacer esto?

Respuesta

17

La asignación previa asigna mal toda la memoria que necesita en una llamada, mientras que redimensionar la matriz (a través de llamadas para agregar, insertar, concatenar o cambiar el tamaño) puede requerir copiar la matriz a un bloque de memoria más grande. De modo que está en lo cierto, se prefiere la asignación previa a (y debería ser más rápido que) el cambio de tamaño.

Hay una serie de formas "preferidas" de preasignar matrices numpy según lo que desee crear. Hay np.zeros, np.ones, np.empty, np.zeros_like, np.ones_like y np.empty_like, y muchos otros que crean matrices útiles como np.linspace y np.arange.

Así

ar0 = np.linspace(10, 20, 16).reshape(4, 4) 

es muy bien si esto se acerca más a la ar0 usted desea.

Sin embargo, para hacer la última columna de todos 1, creo que la mejor forma sería la de simplemente decir

ar0[:,-1]=1 

Puesto que la forma de ar0[:,-1] es (4,), el 1 es broadcasted para que coincida con esta forma.

Cuestiones relacionadas