2017-02-01 141 views
1

這可能是一個非常簡單的問題,但我沒有弄明白。用2d numpy陣列廣播1d numpy陣列

我有一個2D numpy的陣列,其是形狀(3,2)的和形狀的一維數組(3,):

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

我想通過陣列乙劃分陣列A,所得在:

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

但numpy不會讓我這樣做,我認爲,因爲形狀是不正確的。我得到熟悉的'操作數不能與形狀(10,2)(10,)'錯誤一起播出。

我試着重塑和swapaxis的東西,但它不工作。我更希望能夠在沒有for循環的情況下執行此操作(因爲我需要使用大數組來執行此操作),而不必交換數組A的軸(因爲其他數組是這種形狀)。

你們能幫我嗎?

+0

你試過'np.reshape([1,2,4],(3,1))'嗎?一個(10,)數組可以播放到(1,10)和到(2,10)。但在另一端添加維度需要您採取明確的行動。 – hpaulj

+0

[通用廣播規則](https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html#general-broadcasting-rules) – wwii

回答

1

擴展B2D,然後除以 -

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