簡體   English   中英

在 numpy 中,一個形狀可以“廣播”到另一個形狀是什么意思?

[英]What does it mean for a shape to be "broadcastible" to another in numpy?

我正在嘗試在另一個庫中復制 numpy 行為。 我的圖書館缺少的一件事是廣播行為。 運算符的廣播行為在 numpy 中使用非賦值運算符很好地定義, 文檔說明

在對兩個數組進行操作時,NumPy 按元素比較它們的形狀。 它從尾隨維度開始,然后繼續前進。 當兩個維度兼容時

  1. 他們是平等的,或者
  2. 其中之一是 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.

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