2012-02-12 58 views
8

Consideremos los siguientes vectores (esencialmente 2x1 matrices):producto vectorial de un vector en NumPy

a = sc.array([[1], [2], [3]]) 
>>> a 
[[1] 
[2] 
[3]] 

b = sc.array([[4], [5], [6]]) 
>>> b 
[[4] 
[5] 
[6]] 

El producto vectorial de estos vectores se puede calcular utilizando numpy.cross(). ¿Por qué esto no funciona:

import numpy as np 

np.cross(a, b) 
ValueError: incompatible dimensions for cross product 
(dimension must be 2 or 3) 

pero esto hace ?:

np.cross(a.T, b.T) 
[[-3 6 -3]] 

Respuesta

14

para calcular el producto vectorial utilizando numpy.cross, la dimensión (longitud) de la dimensión de matriz que define los dos vectores deben o bien por dos o tres. Para citar la documentación:

Si a y b son matrices de vectores, los vectores se definen por el último eje del a y b por defecto, y estos ejes puede tener unas dimensiones de 2 o 3.

Tenga en cuenta que el último eje es el predeterminado. En su ejemplo:

In [17]: a = np.array([[1], [2], [3]]) 

In [18]: b = np.array([[4], [5], [6]]) 

In [19]: print a.shape,b.shape 
(3, 1) (3, 1) 

el último eje sólo es de longitud 1, por lo que el producto vectorial no está definido. Sin embargo, si usa la transposición, la longitud a lo largo del último eje es 3, por lo que es válida. También puede hacer:

In [20]: np.cross(a,b,axis=0) 
Out[20]: 
array([[-3], 
     [ 6], 
     [-3]]) 

que cuenta cross que los vectores se definen a lo largo del primer eje, en lugar del último eje.

+0

Interesante, gracias. ¿Es posible cambiar el eje predeterminado a 0? – Ingo

+1

@thomas: No es que yo sepa. Pero, ¿es realmente una tarea tan ardua seguir las convenciones de la biblioteca al definir sus vectores, o definir explícitamente su orden para la llamada? – talonmies

+0

No, no lo está, pero estoy escribiendo el código para algunos estudiantes y por vexperience los confunde si, por ejemplo, los vectores son todos vectores de fila cuando se utilizan para los vectores de columna. – Ingo

1

Debe crear ayb así:

a = sc.array([1, 2, 3]) 
b = sc.array([4, 5, 6]) 

para que tengan dimensión = 3.

3

En numpy que a menudo utilizan matrices 1d para representar vectores, y lo tratamos, ya sea como vector fila o un vector columna, dependiendo del contexto, por ejemplo:

In [13]: a = np.array([1, 2, 3]) 

In [15]: b = np.array([4, 5, 6]) 

In [16]: np.cross(a, b) 
Out[16]: array([-3, 6, -3]) 

In [17]: np.dot(a, b) 
Out[17]: 32 

puede almacenar vectores como matrices 2D, esto es más útil cuando se tiene una colección de vectores desea para tratar de una manera similar. Por ejemplo, si quiero cruzar 4 vectores en a con 4 vectores en b. Por defecto numpy asume que los vectores están a lo largo de las últimas dimensiones pero puede usar los argumentos axisa y axisb para especificar explícitamente que los vectores están a lo largo de la primera dimensión.

In [26]: a = np.random.random((3, 4)) 

In [27]: b = np.random.random((3, 4)) 

In [28]: np.cross(a, b, axisa=0, axisb=0) 
Out[28]: 
array([[-0.34780508, 0.54583745, -0.25644455], 
     [ 0.03892861, 0.18446659, -0.36877085], 
     [ 0.36736545, 0.13549752, -0.32647531], 
     [-0.46253185, 0.56148668, -0.10056834]]) 
+2

Bago plantea el punto aquí. Numpy no es MATLAB, puede (y debe) olvidarse de columnas y filas porque las matrices son un concepto computacional y no lo tienen. Las matrices lo hacen. – astrojuanlu

Cuestiones relacionadas