在大型代码库中,我np.broadcast_to
用于广播数组(此处仅使用简单示例):
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 数组上以矢量化方式运行,但不是 ufunc。这些函数不理解广播,这意味着在数组上调用这样的函数y
是低效的。Numpy 之类的解决方案vectorize
也不好,因为虽然它们理解广播,但它们for
在数组元素上引入了一个循环,这样效率非常低。
理想情况下,我想做的是有一个函数,我们可以调用 eg unbroadcast
,它返回一个具有最小形状的数组,如果需要,可以广播回全尺寸。所以例如:
In [4]: z = unbroadcast(y)
In [5]: z.shape
Out[5]: (1, 1, 3)
然后我可以在 上运行第三方功能z
,然后将结果广播回y.shape
.
有没有办法实现unbroadcast
依赖于 Numpy 的公共 API?如果没有,是否有任何黑客可以产生预期的结果?