2015-11-05 27 views
6

Tôi tự hỏi nếu cách tiếp cận dưới đây sẽ được coi là thực hành không tốt, và nếu có, nếu ai đó có thể đưa ra một số hướng dẫn về cách tiếp cận khác.danh sách hiểu với mảng numpy - thực hành xấu?

Đây là mã trong câu hỏi:

a = np.array([[1,2,3],[4,5,6]]) 
b = np.array([-5,5]) 
c = np.array([np.multiply(a[x],b[x]) for x in range(2)]) 

Mục tiêu ở đây là để có được một loạt các hình dạng tương tự như 'a' nơi các giá trị trong phần tử đầu tiên của 'a' được nhân với người đầu tiên phần tử của 'b' và các giá trị trong phần tử thứ hai của 'a' được nhân với phần tử thứ hai của 'b'

Đoạn mã trên hoạt động, nhưng với hỗn hợp của danh sách/mảng liên quan, tôi lo ngại đây là khuyên chống lại - nhưng tôi không rõ ràng về một giải pháp thanh lịch hơn. Rất cám ơn trước!

Trả lời

8

NumPythonic cách sẽ được mở rộng kích thước của b đến một mảng 2D với np.newaxis/None và sau đó để broadcasting đi vào chơi cho một vectorized elementwise multiplication. Việc thực hiện sẽ trông như thế này -

c = a * b[:,None] 

Một khi kích thước được mở rộng, bạn cũng có thể sử dụng np.multiply cho tác dụng tương tự, như vậy -

c = np.multiply(a,b[:,None]) 

Quan trọng nhất, đây là một số số hiệu suất để thuyết phục bạn khi sử dụng broadcasting -

In [176]: a = np.random.rand(2000,3000) 

In [177]: b = np.random.rand(2000) 

In [178]: %timeit np.array([np.multiply(a[x],b[x]) for x in range(a.shape[0])]) 
10 loops, best of 3: 118 ms per loop 

In [179]: %timeit a * b[:,None] 
10 loops, best of 3: 63.8 ms per loop 

In [180]: %timeit np.multiply(a,b[:,None]) 
10 loops, best of 3: 64 ms per loop 
+0

Rất hữu ích, cảm ơn! Tôi sẽ phải hiểu khái niệm "newaxis" tốt hơn. b [: None] .shape sẽ vẫn chỉ ra mảng 1d chứ không phải 2, vì vậy tôi không nhất thiết mong đợi điều này đã hoạt động ... – laszlopanaflex

+3

'b [: None]' rất khác với 'b [:, Không có] '. Dấu phẩy là quan trọng. Đầu tiên là một phần của một slice, 'slice (None, None, None)'. Chữ thứ hai được hiểu bởi 'numpy' để có nghĩa' newaxis' đặc biệt này. – hpaulj

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