python - tutorial - pandas read text
¿Repetir la matriz NumPy sin replicar datos? (5)
¿Funcionaría esto?
import numpy
a = numpy.array([1, 2, 3, 4])
b = numpy.ones((1000, a.shape[0]))
b *= a
b = b.flatten()
Me gustaría crear una matriz 1D NumPy que constaría de 1000 repeticiones consecutivas de otra matriz 1D, sin replicar los datos 1000 veces.
¿Es posible?
Si ayuda, tengo la intención de tratar ambos arreglos como inmutables.
No estoy 100% seguro de lo que quiere decir con "no replicar los datos 1000 veces". Si está buscando un método numpy para compilar b
partir de a
solo golpe (en lugar de bucle), puede usar:
a = np.arange(1000)
b = np.tile(a,1000)
De lo contrario, haría algo como:
a = np.arange(1000)
ii = [700,2000,10000] # The indices you want of the tiled array
b = a[np.mod(ii,a.size)]
b
no es una vista de a
en este caso debido a la elegante indexación (hace una copia), pero al menos devuelve una matriz numpy y no crea la matriz 1000 * 1000x1 en la memoria y solo contiene los elementos que desea.
En cuanto a que sean inmutables (consulte ¿Matriz de números inmutables? ), Deberá cambiar el indicador para cada uno por separado, ya que las copias no conservan la configuración del indicador.
No puedes hacer esto; una matriz NumPy debe tener una zancada consistente a lo largo de cada dimensión, mientras que sus zancadas tendrían que ir en un sentido la mayor parte del tiempo, pero a veces saltar hacia atrás.
Lo más cercano que puede obtener es una matriz 2D de 1000 filas, donde cada fila es una vista de su primera matriz, o un objeto flatiter
, que se comporta como una matriz 1D. (Los flatiters son compatibles con la iteración y la indexación, pero no puede tomar vistas de ellos; toda la indexación hace una copia).
Preparar:
import numpy as np
a = np.arange(10)
Vista 2D:
b = np.lib.stride_tricks.as_strided(a, (1000, a.size), (0, a.itemsize))
objeto de flatiter
c = b.flat
No reclamo que esta sea la solución más elegante, ya que hay que engañar a muchos para que creen una matriz de objetos (vea la línea con el comentario)
from numpy import array
n = 3
a = array([1,2])
a.setflags(write=False)
t = [a]*n + [array([1])] # Append spurious array that is not len(a)
r = array(t,dtype=object)
r.setflags(write=False)
assert id(a) == id(t[1]) == id(r[1])
Se agregó broadcast_to en numpy 1.10, lo que le permite repetir efectivamente una matriz con un poco menos de esfuerzo.
Copiando el estilo de la respuesta aceptada:
import numpy as np
arr = np.arange(10)
repeated = np.broadcast_to(arr, (1000, arr.size))