在一個大的代碼庫,我使用np.broadcast_to
廣播陣列(只是用簡單的例子在這裏):取消廣播numpy的陣列
In [1]: x = np.array([1,2,3])
In [2]: y = np.broadcast_to(x, (2,1,3))
In [3]: y.shape
Out[3]: (2, 1, 3)
其他地方在代碼中,我使用第三方功能,可以運行以Numpy數組的矢量化方式,但不是ufuncs。這些函數不理解廣播,這意味着在像y
這樣的數組上調用這樣的函數效率不高。諸如Numpy的vectorize
這樣的解決方案不好,因爲雖然他們理解廣播,但是他們在數組元素上引入了一個for
循環,這是非常低效的。
理想情況下,我希望能夠做的是有一個函數,我們可以調用例如unbroadcast
,它返回一個最小形狀的數組,如果需要可以將其廣播回全尺寸。因此,例如爲:
In [4]: z = unbroadcast(y)
In [5]: z.shape
Out[5]: (1, 1, 3)
然後我就可以在z
運行第三方功能,那麼廣播結果返回給y.shape
。
有沒有一種方法可以實現unbroadcast
,它依賴於Numpy的公共API?如果沒有,是否有任何黑客可以產生期望的結果?
「y [None,0]'? – Divakar
你是什麼意思「最小的形狀」? 'unbroadcast'返回的N維的最小形狀是不是總是'(1,1,...,1)'(甚至是'(1,)')? –
我的意思是最小的形狀,仍然包含所有需要的數據將其廣播回完整陣列。所以在上面的例子中,「z.shape」是「(1,1,3)」而不是「(1,1,1)」。 – astrofrog