在一个大的代码库,我使用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