python – 取消广播Numpy数组
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 取消广播Numpy数组,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1595字,纯文字阅读大概需要3分钟。
内容图文
![python – 取消广播Numpy数组](/upload/InfoBanner/zyjiaocheng/806/68afdaf4529a4c389a9770d72942c347.jpg)
在一个大的代码库中,我使用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的矢量化之类的解决方案也不好,因为虽然他们理解广播,但他们在数组元素上引入了一个for循环,这样效率非常低.
理想情况下,我希望能够做的是有一个功能,我们可以调用它,例如unbroadcast,返回一个具有最小形状的数组,如果需要,可以将其广播回完整大小.例如:
In [4]: z = unbroadcast(y)
In [5]: z.shape
Out[5]: (1, 1, 3)
然后我可以在z上运行第三方函数,然后将结果广播回y.shape.
有没有办法实现依赖于Numpy的公共API的unbroadcast?如果没有,是否有任何黑客可以产生预期的结果?
解决方法:
这可能相当于您自己的解决方案,只是内置一点.它在numpy.lib.stride_tricks中使用as_strided:
import numpy as np
from numpy.lib.stride_tricks import as_strided
x = np.arange(16).reshape(2,1,8,1) # shape (2,1,8,1)
y = np.broadcast_to(x,(2,3,8,5)) # shape (2,3,8,5) broadcast
def unbroadcast(arr):
#determine unbroadcast shape
newshape = np.where(np.array(arr.strides) == 0,1,arr.shape) # [2,1,8,1], thanks to @Divakar
return as_strided(arr,shape=newshape) # strides are automatically set here
z = unbroadcast(x)
np.all(z==x) # is True
请注意,在我的原始答案中,我没有定义函数,并且生成的z数组具有(64,0,8,0)作为步幅,而输入具有(64,64,8,8).在当前版本中,返回的z数组与x具有相同的步幅,我想传递并返回数组会强制创建副本.无论如何,我们总是可以在as_strided中手动设置步幅,以便在所有情况下获得相同的数组,但在上面的设置中似乎没有必要.
内容总结
以上是互联网集市为您收集整理的python – 取消广播Numpy数组全部内容,希望文章能够帮你解决python – 取消广播Numpy数组所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。