2009-08-29 80 views
10

Tôi có một tạm python ndarray ở một số mã tôi đang đọc mà bị thế này: (. Tức là tương đương với m * m)Ma trận ** 2 có nghĩa là gì trong python/numpy?

x = temp**2 

Đây có phải là dấu chấm vuông hoặc hình vuông ma trận (tức là m phải một ma trận vuông)? Đặc biệt, tôi muốn biết liệu tôi có thể thoát khỏi các transpose trong mã này:

temp = num.transpose(whatever) 
num.sum(temp**2,axis=1)) 

và biến nó thành này:

num.sum(whatever**2,axis=0) 

Điều đó sẽ tiết kiệm cho tôi ít nhất 0.1ms, và rõ ràng xứng đáng với thời gian của tôi.
Cảm ơn! Toán tử ** không thể giải quyết được và tôi không biết gì cả! a

Trả lời

12

Nó chỉ là hình vuông của mỗi phần tử.

from numpy import * 
a = arange(4).reshape((2,2)) 
print a**2 

in

[[0 1] 
[4 9]] 
+1

Woot, cảm ơn. Fifteeeeenherewecome. –

+1

Bạn được chào đón. (Tôi đã đăng nhập trở lại để chỉ ra một lưu ý rõ ràng, rằng nếu bạn là ndarray là> 2 kích thước, tôi không nghĩ rằng transposing, trục trao đổi điều sẽ làm việc.) – tom10

+1

Tôi có thể thấy nơi này có thể gây nhầm lẫn. Nếu không biết Python, và hiểu rằng đối với số bình phương thực (và phức tạp) có nghĩa là "nhân một số", thì sẽ hợp lý để giả định rằng nó có nghĩa là "nhân một ma trận một mình" cho ma trận. Điều này có nghĩa là ma trận có số lượng hàng và cột bằng nhau, tất nhiên. – duffymo

4

** là các nhà điều hành tăng-to-điện bằng Python, vì vậy x**2 có nghĩa là "x bình phương" bằng Python - bao gồm NumPy. Các hoạt động như vậy trong phần tử luôn luôn áp dụng phần tử theo nguyên tố, do đó, x**2 hình vuông mỗi phần tử của mảng x (bất kỳ số thứ nguyên nào) giống như, x*2 sẽ tăng gấp đôi mỗi phần tử hoặc x+2 sẽ tăng từng phần tử lên hai (trong mỗi trường hợp, x thích hợp không bị ảnh hưởng - kết quả là một mảng tạm thời mới có cùng hình dạng như x!).

Sửa: như @ kaizer.ze chỉ ra, trong khi những gì tôi đã viết giữ cho numpy.array đối tượng, nó không áp dụng cho numpy.matrix đối tượng, nơi nhân nghĩa nhân ma trận chứ không phải là phần tử bằng cách hoạt động yếu tố như cho array (và tương tự như để nâng cao sức mạnh) - thực sự, đó là sự khác biệt chính giữa hai loại. Khi Scipy tutorial đặt nó, ví dụ:

Khi chúng tôi sử dụng numpy.array hoặc numpy.matrix có sự khác biệt. A * x sẽ nằm trong ma trận trường hợp sau sản phẩm, không phải sản phẩm theo nguyên tố là với mảng.

ví dụ như numpy reference đặt nó:

Một ma trận là một chuyên ngành 2-d mảng mà vẫn giữ được bản chất 2-d của mình thông qua các hoạt động . Nó có một số toán tử đặc biệt là , chẳng hạn như * (ma trận phép nhân) và ** (ma trận điện).

+1

Thật đáng buồn là không đơn giản như vậy, như tôi đã trả lời; các hành vi khác nhau của 'mảng' và' ma trận' có thể gây nhầm lẫn điều này, và các toán tử như '*' và '**' thay đổi ý nghĩa! (Nếu A * B là ma trận nhân whith A, B ma trận, A ** 2 phải là ma trận lũy thừa tất nhiên.) – u0b34a0f6ae

+0

Có, có một sự khác biệt giữa ma trận và mảng - mặc dù '**' là tất nhiên vẫn còn tăng hoạt động trên điện, hoạt động trên ma trận áp dụng cho "ma trận", trên một mảng đối với "các phần tử". Tốt, hãy để tôi chỉnh sửa để làm rõ. –

5

Bạn nên đọc NumPy for Matlab Users. Hoạt động quyền lực theo nguyên tố được đề cập ở đó và bạn cũng có thể thấy điều đó ở dạng gumpy, một số toán tử áp dụng khác nhau cho arraymatrix.

>>> from numpy import * 
>>> a = arange(4).reshape((2,2)) 
>>> print a**2 
[[0 1] 
[4 9]] 
>>> print matrix(a)**2 
[[ 2 3] 
[ 6 11]]