vectores una transpuesta norma multiplicar matriz matrices inversa ejemplos como calcular python matlab numpy octave linear-algebra

una - normalize python



"ClonaciĆ³n" de vectores de fila o columna (7)

Algunas 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 bastante fácilmente:

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 (en [16])? ¿Hay alguna manera de lograr esta tarea en python de una manera más elegante?


Aquí hay una manera elegante y pitonica de hacerlo:

>>> array([[1,2,3],]*3) array([[1, 2, 3], [1, 2, 3], [1, 2, 3]]) >>> array([[1,2,3],]*3).transpose() array([[1, 1, 1], [2, 2, 2], [3, 3, 3]])

el problema con [16] parece ser que la transposición no tiene efecto para una matriz. probablemente prefieras una matriz:

>>> x = array([1,2,3]) >>> x array([1, 2, 3]) >>> x.transpose() array([1, 2, 3]) >>> matrix([1,2,3]) matrix([[1, 2, 3]]) >>> matrix([1,2,3]).transpose() matrix([[1], [2], [3]])


Creo que usar la transmisión en numpy es lo mejor y más rápido

Hice una comparación como siguiente

import numpy as np b = np.random.randn(1000) In [105]: %timeit c = np.tile(b[:, newaxis], (1,100)) 1000 loops, best of 3: 354 µs per loop In [106]: %timeit c = np.repeat(b[:, newaxis], 100, axis=1) 1000 loops, best of 3: 347 µs per loop In [107]: %timeit c = np.array([b,]*100).transpose() 100 loops, best of 3: 5.56 ms per loop

aproximadamente 15 veces más rápido usando difusión


En primer lugar, tenga en cuenta que con las operaciones de difusión de numpy generalmente no es necesario duplicar filas y columnas. Ver this y this para descripciones.

Pero para hacer esto, repeat y newaxis son probablemente la mejor manera

In [12]: x = array([1,2,3]) In [13]: repeat(x[:,newaxis], 3, 1) Out[13]: array([[1, 1, 1], [2, 2, 2], [3, 3, 3]]) In [14]: repeat(x[newaxis,:], 3, 0) Out[14]: array([[1, 2, 3], [1, 2, 3], [1, 2, 3]])

Este ejemplo es para un vector de fila, pero aplicar esto a un vector de columna es, con suerte, obvio. repetir parece deletrear bien esto, pero también puede hacerlo a través de la multiplicación como en su ejemplo

In [15]: x = array([[1, 2, 3]]) # note the double brackets In [16]: (ones((3,1))*x).transpose() Out[16]: array([[ 1., 1., 1.], [ 2., 2., 2.], [ 3., 3., 3.]])


Puedes usar

np.tile(x,3).reshape((4,3))

azulejo generará las repeticiones del vector

y la remodelación le dará la forma que desee


Use numpy.tile :

>>> tile(array([1,2,3]), (3, 1)) array([[1, 2, 3], [1, 2, 3], [1, 2, 3]])

o para repetir columnas:

>>> tile(array([[1,2,3]]).transpose(), (1, 3)) array([[1, 1, 1], [2, 2, 2], [3, 3, 3]])


np.broadcast_to es incluso más rápido que np.tile :

x = np.arange(9) %timeit np.broadcast_to(x, (6,9)) 100000 loops, best of 3: 3.6 µs per loop %timeit np.tile(x, (6,1)) 100000 loops, best of 3: 8.4 µs per loop

Pero el método más rápido es @ tom10:

%timeit np.repeat(x[np.newaxis, :], 6, axis=0) 100000 loops, best of 3: 3.15 µs per loop


import numpy as np x=np.array([1,2,3]) y=np.multiply(np.ones((len(x),len(x))),x).T print(y)

rendimientos:

[[ 1. 1. 1.] [ 2. 2. 2.] [ 3. 3. 3.]]