[英]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.