2012-01-20 59 views
18

Tôi đang cố gắng chuyển một số mã của tôi từ MATLAB sang python và một số trong đó sử dụng hàm bsxfun() để nhân bản ảo, sau đó nhân hoặc chia (tôi cũng sử dụng nó cho các phép toán logic). Tôi muốn để có thể làm điều này mà không thực sự sao chép các vector (hoặc với một chức năng hoặc với một số loại ma trận đường chéo) trước khi nhân hoặc chia để tiết kiệm bộ nhớ và thời gian.Có tương đương với chức năng MATLAB bsxfun trong python không?

Nếu có tương đương bsxfun trong thư viện C thuộc loại nào đó, điều đó tất nhiên cũng sẽ hoạt động.

+6

Nếu bạn đang làm việc với mảng trong Python, bạn sẽ muốn sử dụng numpy (www.numpy.org) và có nhiều đặc tính phát sóng rất đẹp. (Xem http://www.scipy.org/EricsBroadcastingDoc để có hướng dẫn ngắn.) – DSM

+2

Theo [câu hỏi này] (http://stackoverflow.com/questions/3213212/matlab-equivalent-of-numpy-broadcasting) tương đương với phát sóng numpy trong MATLAB là 'bsxfun', vì vậy tôi đoán nó hoạt động theo cách khác. – jcollado

+0

Hiện tại, có một hướng dẫn phát sóng “chính thức” tại http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html Hướng dẫn được đề xuất bởi DSM vẫn có thể được tìm thấy tại https: // github. com/dwf/rescued-scipy-wiki/blob/master/EricsBroadcastingDoc.rst – user2809402

Trả lời

3

Không thực sự là tương đương với bsxfun, mà tôi biết, mặc dù có nhiều vấn đề về việc phát sóng cho bạn, như những người khác đã đề cập.

Điều này thường được quảng cáo là một lợi thế của đệm trên matlab, và đúng là rất nhiều phát sóng đơn giản hơn, nhưng bsxfun thực sự tổng quát hơn, vì nó có thể lấy các hàm do người dùng định nghĩa.

Numpy có điều này: http://docs.scipy.org/doc/numpy/reference/generated/numpy.apply_along_axis.html nhưng chỉ cho 1d.

2

Python rất dễ sử dụng so với MATLAB bsxfun (x) trong khoanh vùng trăn có thể dễ dàng được thực hiện bởi ... trong mảng [], ví dụ: m [...,:] Bạn có thể thử điều này:

>>>m = np.zeros([5,13], dtype=np.float32) 
>>>print(m) 

    [[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 
    [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 
    [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 
    [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 
    [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]] 

>>>c=np.array([[1,2,3,4,5,6,7,8,9,10,11,12,13]]) 
>>>print(m[...,:] +4*c) 
[[ 4. 8. 12. 16. 20. 24. 28. 32. 36. 40. 44. 48. 52.] 
[ 4. 8. 12. 16. 20. 24. 28. 32. 36. 40. 44. 48. 52.] 
[ 4. 8. 12. 16. 20. 24. 28. 32. 36. 40. 44. 48. 52.] 
[ 4. 8. 12. 16. 20. 24. 28. 32. 36. 40. 44. 48. 52.] 
[ 4. 8. 12. 16. 20. 24. 28. 32. 36. 40. 44. 48. 52.]] 
Các vấn đề liên quan