punto producto matrices cruz python numpy scipy

python - matrices - Punto producto de un vector en SciPy/NumPy(obteniendo ValueError: los objetos no están alineados)



producto cruz (6)

Acabo de empezar a aprender SciPy y estoy luchando con las funciones más básicas.

Considere el siguiente vector estándar:

In [6]: W=array([[1],[2]]) In [7]: print W [[1] [2]]

Si lo entiendo correctamente, esta debería ser la representación SciPy de un vector matemático estándar 2x1, como este:

(1) (2)

El producto escalar de este vector debería ser simplemente 1*1+2*2=5 . Sin embargo, esto no funciona en SciPy:

In [16]: dot(W, W) --------------------------------------------------------------------------- ValueError Traceback (most recent call last) /home/ingo/<ipython-input-16-961b62a82495> in <module>() ----> 1 dot(W, W) ValueError: objects are not aligned

Tenga en cuenta que lo siguiente funciona. Esto debería ser un vector de la forma (1 2) si no me equivoco.

In [9]: V=array([1,2]) In [10]: print V [1 2] In [11]: dot(V, V) Out[11]: 5

¿Cuál es mi concepto erróneo? ¿Qué estoy haciendo mal?


En el primer ejemplo, W es una matriz de 2 dimensiones, mientras que en la última (la que funciona), tiene solo 1 dim.

Yon puede estar seguro de que la 2ª manera es la forma correcta de hacerlo.


En su primer caso numpy está generando el vector como una matriz bidimensional, básicamente una matriz de 2 por 1. En ese caso, el producto escalar no se puede tomar porque la matriz m-by-n se puede puntear solo con una matriz n-by-k. La solución es usar:

dot(W.T,W)

Esto es lo mismo que la forma en que xx a veces se escribe x ^ T x.

En el segundo caso, por comodidad numpy está generando una matriz unidimensional en lugar de una matriz, por lo que el producto escalar tiene una definición simple. Si tuviera que generar una matriz de 1 por 2 usando

W = np.array([[1,2]])

entonces obtendrías el mismo comportamiento que en el primer caso.


Es una matriz de dos matrices, no una matriz de dos valores. El primero podría considerarse como una matriz: dos filas con una columna cada una.

El segundo es correcto; también te da el producto correcto de punto correcto. Cree en tus ojos; usa el segundo.


Estás equivocado sobre la forma de la matriz que pasas:

>>> W = np.array([[1], [2]]) >>> W.shape (2, 1) >>> W = np.array([1, 2]) >>> W.shape (2,)

Como ha observado, el uso de np.dot en la segunda definición de W funciona como se esperaba. Para dibujar un punto en una matriz de 2-d con sí mismo, cuando no es cuadrado, debe transponer:

>>> W = np.array([[1], [2]]) >>> np.dot(W, W.transpose()) array([[1, 2], [2, 4]])

Un atajo para transpose es WT

Tenga en cuenta que la forma del resultado difiere dependiendo de si comienza con la transposición o el original, como era de esperar:

>>> np.dot(W.T, W) array([[5]]) >>> np.dot(W.T, W).shape (1, 1)

Vea los documentos numpy para más.


La clave aquí es que numpy / scipy respeta la forma de las matrices cuando se calculan productos de puntos. Mirando su primer ejemplo, W es una matriz 2x1:

In [7]: W=array([[1],[2]]) In [8]: print W.shape ------> print(W.shape) (2, 1)

por lo tanto, es necesario usar el operador de transposición para calcular el producto de puntos (interno) de W consigo mismo:

In [9]: print dot(W.T,W) ------> print(dot(W.T,W)) [[5]] In [10]: print np.asscalar(dot(W.T,W)) -------> print(np.asscalar(dot(W.T,W))) 5


Debería usar vdot : "Devuelve el producto punto de dos vectores". Esta función aplana los argumentos de entrada y da los resultados que espera. Para tu ejemplo:

>>> W = np.array([[1], [2]]) >>> np.vdot(W, W) 5 >>>