【发布时间】:2016-11-28 13:43:42
【问题描述】:
在大型代码库中,我使用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 循环,这样效率非常低。
理想情况下,我想做的是拥有一个函数,我们可以调用它,例如unbroadcast,它返回一个具有最小形状的数组,如果需要,可以将其广播回完整大小。例如:
In [4]: z = unbroadcast(y)
In [5]: z.shape
Out[5]: (1, 1, 3)
然后我可以在z 上运行第三方函数,然后将结果广播回y.shape。
有没有办法实现依赖于 Numpy 的公共 API 的 unbroadcast?如果没有,是否有任何黑客可以产生预期的结果?
【问题讨论】:
-
类似
y[None,0]? -
什么是“最小形状”?
unbroadcast返回的 N 维的最小形状不总是(1, 1, ..., 1)(甚至是(1,))吗? -
我的意思是最小的形状,它仍然包含将它广播回整个数组所需的所有数据。所以在上面的例子中,
z.shape是(1,1,3)而不是(1,1,1)。
标签: python arrays numpy array-broadcasting