2017-02-01 27 views
1

これはおそらく本当に簡単な質問ですが、私はこれを考え出していません。2dのnumpyの配列で1dのnumpyの配列をブロードキャスト

I形状である2D numpyのアレイ、(3,2)及び形状の1Dアレイ(3)を有する:Iが得られ、アレイBによって配列Aを分割したい

A = [[2,4],[6,8][10,12]] 
    B = [1,2,4] 

をin:

[[2,4],[3,4][2.5,3]] 

numpyは私にこれをさせませんが、形状が正しくないと思います。私はおなじみの 'オペランドがシェイプ(10,2)(10、)エラーと一緒に放送されないことがあります。

私は変形とswapaxisで物事を試みましたが、それは動作していません。私はforループなしで(これは大規模な配列で何回も行う必要があるため)、配列Aの軸を入れ替えなくても可能です(他の配列はこの形状であるため)。

あなたは私を助けることができますか?

+0

'np.reshape([1,2,4]、(3,1))'を試しましたか? A(10)配列は(1,10)と(2,10)にブロードキャストできます。しかし、もう一方の端にディメンションを追加するには、ユーザーの明示的な操作が必要です。 – hpaulj

+0

[一般的なブロードキャストルール](https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html#general-broadcasting-rules) – wwii

答えて

1

2DBを拡張した後、分割 -

A/B[:,None].astype(float) 

サンプルラン -

In [9]: A 
Out[9]: 
array([[ 2, 4], 
     [ 6, 8], 
     [10, 12]]) 

In [10]: B 
Out[10]: array([1, 2, 4]) 

In [11]: A/B[:,None].astype(float) 
Out[11]: 
array([[ 2. , 4. ], 
     [ 3. , 4. ], 
     [ 2.5, 3. ]]) 

またはfrom __future__ import divisionを使用フローティングPTアレイをもたらすことが分割の世話をする -

In [14]: from __future__ import division 

In [15]: A/B[:,None] 
Out[15]: 
array([[ 2. , 4. ], 
     [ 3. , 4. ], 
     [ 2.5, 3. ]]) 

逆数を乗算したパフォーマンスの向上 - この上

In [32]: A = np.random.rand(300,200) 

In [33]: B = np.random.rand(300) 

In [34]: from __future__ import division 

In [35]: %timeit A/B[:,None] 
1000 loops, best of 3: 336 µs per loop 

In [36]: %timeit A*(1.0/B[:,None]) 
10000 loops, best of 3: 101 µs per loop 

詳細情報はhereを見つけることができます。また、Bの値が0に極端に近い場合、この方法を使用する際には注意が必要です。

+0

あなたは本当にありがとうございます。ジョブが完了しました – user90465

関連する問題