¿Cuál es la forma preferida de preasignar matrices NumPy?

Soy nuevo en NumPy / SciPy. De la documentación, parece más eficiente preasignar una única matriz en lugar de llamar a agregar / insertar / concatenar.

Por ejemplo, para agregar una columna de 1 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 esto:

 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 el primero es mejor), y mi segunda pregunta es, en este momento, simplemente estoy preasignando mis arreglos de esta manera (como noté en varios ejemplos de libros de cocina en el sitio de SciPy):

 np.zeros((8,5)) 

¿Cuál es la forma ‘preferida por NumPy’ de hacer esto?

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

Hay una serie de formas “preferidas” para preasignar matrices numpy dependiendo de 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 .

Asi que

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

está bien si esto se acerca más al ar0 que deseas.

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

 ar0[:,-1]=1 

Como la forma de ar0[:,-1] es (4,) , el 1 se emite para coincidir con esta forma.