python - dtype - numpy array
¿Cuál es la forma preferida de preasignar matrices NumPy? (1)
La asignación previa de mallocs a toda la memoria que necesita en una llamada, mientras que cambiar el tamaño de la matriz (mediante 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 broadcasted para coincidir con esta forma.
Soy nuevo en NumPy / SciPy. A partir de la documentación, parece más eficiente preasignar una matriz única 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?