簡體   English   中英

使用 2d numpy 數組廣播 1d numpy 數組

[英]Broadcasting a 1d numpy array with a 2d numpy array

這可能是一個非常簡單的問題,但我沒有弄清楚這一點。

我有一個形狀為 (3,2) 的二維 numpy 數組和一個形狀為 (3,) 的一維數組:

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

我想將數組 A 除以數組 B,結果:

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

但是numpy不會讓我這樣做,我覺得是因為形狀不對。 我得到了熟悉的“操作數無法與形狀 (10,2) (10,) 一起廣播”錯誤。

我嘗試了 reshape 和 swapaxis 的東西,但它不起作用。 我更希望能夠在沒有 for 循環的情況下執行此操作(因為我需要使用大數組多次執行此操作)並且不必交換數組 A 的軸(因為其他數組也是這種形狀)。

你們能幫幫我嗎?

B擴展到2D然后除以 -

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 ,則需要小心使用此方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM