A veces es útil "clonar" un vector de fila o columna a una matriz. Al clonar me refiero a convertir un vector de fila como
[1,2,3]
En una matriz
[[1,2,3]
[1,2,3]
[1,2,3]
]
o un vector de columna como
[1
2
3
]
dentro
[[1,1,1]
[2,2,2]
[3,3,3]
]
En matlab u octava, esto se hace con bastante facilidad:
x = [1,2,3]
a = ones(3,1) * x
a =
1 2 3
1 2 3
1 2 3
b = (x') * ones(1,3)
b =
1 1 1
2 2 2
3 3 3
Quiero repetir esto en numpy, pero sin éxito
In [14]: x = array([1,2,3])
In [14]: ones((3,1)) * x
Out[14]:
array([[ 1., 2., 3.],
[ 1., 2., 3.],
[ 1., 2., 3.]])
# so far so good
In [16]: x.transpose() * ones((1,3))
Out[16]: array([[ 1., 2., 3.]])
# DAMN
# I end up with
In [17]: (ones((3,1)) * x).transpose()
Out[17]:
array([[ 1., 1., 1.],
[ 2., 2., 2.],
[ 3., 3., 3.]])
¿Por qué no funcionaba el primer método ( In [16]
)? ¿Hay alguna manera de lograr esta tarea en Python de una manera más elegante?
python
numpy
linear-algebra
Boris Gorelik
fuente
fuente
repmat
:repmat([1 2 3],3,1)
orepmat([1 2 3].',1,3)
repmat
.tile_df
Respuestas:
Aquí hay una forma elegante y pitónica de hacerlo:
El problema con
[16]
parece ser que la transposición no tiene ningún efecto para una matriz. probablemente quieras una matriz en su lugar:fuente
(N,1)
matriz de forma usando.reshape(-1, 1)
)numpy.tile
como se muestra en la respuesta de pv .Uso
numpy.tile
:o para repetir columnas:
fuente
tile
método es 19.5 veces más rápido que el método en la respuesta actualmente aceptada (usando el método del operador de multiplicación).(1, 3)
copia tres veces esta columna, por lo que las filas del resultado contienen un único elemento distinto cada una.Primero tenga en cuenta que con las operaciones de transmisión de numpy generalmente no es necesario duplicar filas y columnas. Vea esto y esto para descripciones.
Pero para hacer esto, repetir y newaxis son probablemente la mejor manera
Este ejemplo es para un vector de fila, pero es de esperar que aplicar esto a un vector de columna sea obvio. la repetición parece deletrear esto bien, pero también puedes hacerlo mediante la multiplicación como en tu ejemplo
fuente
np.repeat
vsnp.tile
?Dejar:
Asignaciones de costo cero
Una vista no toma memoria adicional. Por lo tanto, estas declaraciones son instantáneas:
Asignación forzada
Si desea forzar los contenidos a residir en la memoria:
Los tres métodos tienen aproximadamente la misma velocidad.
Cálculo
Los tres métodos tienen aproximadamente la misma velocidad.
Conclusión
Si desea replicar antes de un cálculo, considere usar uno de los métodos de "asignación de costo cero". No sufrirá la penalización de rendimiento de la "asignación forzada".
fuente
Creo que usar la transmisión en numpy es lo mejor y más rápido
Hice una comparación de la siguiente manera
aproximadamente 15 veces más rápido usando la transmisión
fuente
None
para hacer lo mismo.Una solución limpia es usar la función de producto externo de NumPy con un vector de unos:
da
n
filas repetidas. Cambie el orden de los argumentos para obtener columnas repetidas. Para obtener el mismo número de filas y columnas, puede hacerfuente
Puedes usar
el mosaico generará las repeticiones del vector
y remodelar le dará la forma que deseas
fuente
Si tiene un marco de datos de pandas y desea preservar los tipos, incluso los categóricos, esta es una forma rápida de hacerlo:
fuente
rendimientos:
fuente