2015-11-05 2 views
6

もしそうなら、誰かが別のアプローチに向けたいくつかのガイダンスを与えることができれば、以下のアプローチは、悪い習慣と考えられ、そしてられる場合、私は疑問に思って。ここ数字の配列を持つリストの理解 - 悪い習慣?

は、問題のコードである「」の最初の要素の値が '最初によって乗算されるように

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

ここでの目的は、同じ形状の配列を得ることです'b'の要素と'a 'の2番目の要素の値に' b 'の2番目の要素が乗算されます

上記のコードは機能しますが、リスト/配列が混在すると、私はより洗練されたソリューションについてはっきりしていません。事前に多くの感謝!

答えて

8

NumPythonic方法はnp.newaxis/Noneと2Dアレイにbの寸法を拡張した後、broadcastingvectorized 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

非常に参考になりました。私は、 "newaxis"コンセプトをよりよく理解しなければなりません。 のb [:なし] .shapeはまだ1次元配列ではなく2を示すことになるので、私は必ずしもこれが... – laszlopanaflex

+3

'bを働いていると期待していない[:なし]' 'のb [非常に異なっていない:,なし]。コンマは重要です。最初はスライスの一部で、 'slice(None、None、None)'です。二つ目は、この特別な 'newaxis'という意味を持つ' numpy'によって理解されます。 – hpaulj

関連する問題