2012-02-12 2 views
8

Рассмотрим следующие векторы (в основном 2x1 матрицы):Крест произведение вектора в NumPy

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

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

Поперечное произведение этих векторов могут быть вычислены с помощью numpy.cross(). Почему это не работает:

import numpy as np 

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

но это делает ?:

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

ответ

14

Чтобы вычислить векторное произведение с помощью numpy.cross, размер (длина) размерности массива, который определяет два вектора должны либо с помощью два или три. Процитирую документацию:

Если a и b являются массивы векторов, векторы определяются по последней оси a и b по умолчанию, и эти оси могут иметь размеры 2 или 3.

Обратите внимание, что последняя ось является значением по умолчанию. В вашем примере:

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) 

Последняя ось имеет длину 1, поэтому крест продукта не определен. Однако, если вы используете транспонирование, длина вдоль последней оси равна 3, поэтому она действительна. Вы также можете сделать:

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

, который говорит cross, что векторы определены вдоль первой оси, а не последней оси.

+0

Интересно, спасибо. Можно ли изменить ось по умолчанию на 0? – Ingo

+1

@thomas: Не то, что я знаю. Но действительно ли такая трудная задача либо следовать правилам библиотеки при определении ваших векторов, либо явно определять их порядок для вызова? – talonmies

+0

Нет, это не так, но я пишу код для некоторых учеников, и по опыту он смущает их, если, например, векторы - это все векторы строк, когда они используются для векторов столбцов. – Ingo

1

Вы должны создать и б так:

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

так, что они имеют размерность = 3.

3

В NumPy мы часто используем 1d массивы для представления векторов, и мы рассматриваем его как либо вектор-строка или вектор-столбец, в зависимости от контекста, например:

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 

вы можете хранить векторы как 2d массивов, это наиболее полезно, когда у вас есть набор векторов вы хотите лечить подобным образом. Например, если я хочу пересечь 4 вектора в a с 4 векторами в b. По умолчанию numpy предполагает, что векторы находятся по последним измерениям, но вы можете использовать аргументы axisa и axisb, чтобы явно указать, что векторы расположены вдоль первого измерения.

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 поднимает точку здесь. Numpy - это не MATLAB, вы можете (и должны) забыть о столбцах и строках, потому что массивы являются вычислительной концепцией и не имеют ее. Матрицы. – astrojuanlu

Смежные вопросы