2015-11-05 33 views
6

我想知道如果下面的方法會被認爲是不好的做法,如果是這樣,如果有人能夠給對另一種方法的指導。列表理解與numpy的陣列 - 不好的做法?

這裏是有問題的代碼:

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)]) 

這裏的目的是爲了獲得相同形狀的陣列作爲「A」,其中在所述第一元件中的值「A」是由第一相乘'b'的元素和'a'的第二個元素的值乘以'b'的第二個元素

上面的代碼有效,但考慮到涉及的列表/數組的混合,我擔心這是不建議 - 但我不清楚更優雅的解決方案。提前謝謝了!

回答

8

NumPythonic方式將是的b尺寸與np.newaxis/None延伸到一個二維數組,然後讓broadcasting發揮作用爲一個vectorized elementwise multiplication。實施應該是這樣的 -

c = a * b[:,None] 

一旦尺寸擴展,您還可以使用np.multiply達到相同的效果,像這樣 -

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

最重要的是,這裏的一些業績數字說服你使用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

這非常有幫助,謝謝!我必須更好地理解「新軸」概念。 B [:無] .shape仍舊代表一維數組,而不是2,所以我不一定會想到這已經奏效...... – laszlopanaflex

+3

'B [:無]'和'B [很大的不同:,無]'。逗號很重要。第一個是一個切片,切片'(無,無,無)'的一部分。二是通過'numpy'理解爲這個特殊的'newaxis'意義。 – hpaulj