[英]What does it mean for a shape to be "broadcastible" to another in numpy?
我正在嘗試在另一個庫中復制 numpy 行為。 我的圖書館缺少的一件事是廣播行為。 運算符的廣播行為在 numpy 中使用非賦值運算符很好地定義, 文檔說明:
在對兩個數組進行操作時,NumPy 按元素比較它們的形狀。 它從尾隨維度開始,然后繼續前進。 當兩個維度兼容時
- 他們是平等的,或者
- 其中之一是 1
a * b 很容易,但是 a *= b 或 a[:] = b 呢? numpy 中的賦值似乎遵循一些廣播規則,即:
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
a = a.reshape(3,1,1,3)
b = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = b.reshape(1,1,3,3)
c = a * b # works!
a *= b # fails, non-broadcastable output operand with shape (1,1,3,3) doesn't match the broadcast shape (3,1,1,3)
a[:] = b #fails, could not broadcast input array from shape (1,1,3,3) into to shape (3,1,1,3)
b[:,:,:] = a[1,0,0,:] # works!
現在,我可以直觀地理解一些規則,為什么對其中一些分配沒有意義。 問題是我沒有看到任何規則集來管理整個分配的廣播。 我認為它與輸出位置形狀匹配有關,盡管對於最后一個工作示例(他們沒有),即使該邏輯失敗了。 我能找到的最接近的是文檔中的一個語句(強調我的):
如前所述,可以使用單個索引、切片以及索引和掩碼數組來選擇要分配給的數組子集。 分配給索引數組的值必須形狀一致(與索引生成的形狀相同或可廣播)。 例如,允許為切片分配一個常量:
這里“可廣播到形狀”的定義是什么?
(1,1,3,3) 成形為 (3,1,1,3)
形狀為 (1,1,3,3) 的b
可以廣播到 (3,1,3,3) 但不能廣播到 (3,1,1,3)。 第三個維度是3
,不能更改為1
。
這樣做時a*=
與a[:]=
,的形狀a
不改變。
a[1,0,0,:]
是 (1,1,3) 可以廣播到 (1,1,1,3) 和廣播到 (1,1,3,3)。
隨着c = a*b
,廣播是:
(3,1,1,3) * (1,1,3,3) => (3,1,3,3)
的一個昏暗的a
增加到3的另一個暗淡b
也增加至3與二進制運算符*
的參數自動播放。 在分配中,只有 RHS 是。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.