2012-02-12 43 views
8

Hãy xem xét các vectơ sau (thực chất 2x1 ma trận):chéo sản phẩm của một vector trong NumPy

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

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

Các sản phẩm chéo của các vectơ có thể được tính bằng numpy.cross(). Tại sao điều này không làm việc:

import numpy as np 

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

nhưng điều này không ?:

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

Trả lời

14

Để tính toán sản phẩm chéo sử dụng numpy.cross, kích thước (chiều dài) của kích thước mảng trong đó xác định hai vectơ phải hoặc bằng cách hai hoặc ba. Để trích dẫn tài liệu:

Nếu ab là mảng của vectơ, các vectơ được định nghĩa bởi các trục cuối cùng của ab theo mặc định, và những trục có thể có kích thước 2 hoặc 3.

Lưu ý rằng trục cuối cùng là mặc định. Trong ví dụ của bạn:

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) 

trục cuối cùng chỉ có chiều dài 1, vì vậy sản phẩm chéo không được xác định. Tuy nhiên, nếu bạn sử dụng transpose, chiều dài dọc theo trục cuối cùng là 3, do đó, nó là hợp lệ. Bạn cũng có thể làm:

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

cho biết các vectơ được xác định dọc theo trục đầu tiên, chứ không phải trục cuối cùng.

+0

Thú vị, cảm ơn. Có thể thay đổi trục mặc định thành 0 không? – Ingo

+1

@thomas: Không phải là tôi biết. Nhưng nó thực sự là một nhiệm vụ khó khăn để thực hiện theo các quy ước của thư viện khi xác định các vectơ của bạn, hoặc để xác định rõ ràng thứ tự của họ cho cuộc gọi? – talonmies

+0

Không phải không, nhưng tôi đang viết mã cho một số sinh viên và bởi sự vexperience nó gây nhầm lẫn cho họ nếu ví dụ vectơ là tất cả các vectơ hàng khi chúng được sử dụng để vectơ cột. – Ingo

1

Bạn nên tạo a và b như thế này:

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

để họ có kích thước = 3.

3

Trong NumPy chúng ta thường sử dụng các mảng 1d để đại diện cho vectơ, và chúng tôi đối xử với nó như hoặc là một vector hàng hoặc vectơ cột tùy thuộc vào ngữ cảnh, ví dụ:

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 

Bạn có thể lưu trữ vectơ làm mảng 2d, điều này hữu ích nhất khi bạn có bộ sưu tập vectơ bạn muốn để điều trị theo cách tương tự. Ví dụ, nếu tôi muốn vượt qua 4 vectơ trong một với 4 vectơ trong b. Theo mặc định numpy giả định các vectơ là dọc theo các kích thước cuối cùng nhưng bạn có thể sử dụng các đối số axisa và axisb để xác định rõ ràng rằng các vectơ nằm dọc theo thứ nguyên đầu tiê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 tăng điểm ở đây. Numpy không phải là MATLAB, bạn có thể (và nên) quên đi các cột và hàng vì mảng là một khái niệm tính toán và không có nó. Ma trận làm. – astrojuanlu

Các vấn đề liên quan