【发布时间】:2019-08-03 03:59:14
【问题描述】:
我探索了关于广播https://docs.scipy.org/doc/numpy-1.13.0/user/basics.broadcasting.html的标准python文档
每次我探索这个主题时,我都找不到足够的内部细节来说明广播在现实中是如何工作的,这是否与矢量化有关?
根据文档,广播是一种内存效率高的操作,它不会在内存中进行实际复制,因此算术计算在内部是如何工作的,
任何源代码或任何谈论底层概念的资源都将有助于澄清我的疑问。
【问题讨论】:
-
“诀窍”在于如何在广播数组中设置
strides(参见How to understand numpy strides for layman?)。例如。您可以使用0步幅沿一个维度无限重复数组,而无需使用更多内存。 -
@jdehesa 虽然我现在理解了 strides 背后的概念,感谢上面的链接,但我仍然无法将点与广播联系起来,我想我在这里遗漏了一些非常基本的东西,因为算术运算在一维数组和标量值之间通过将标量广播到数组的相同大小来产生向量化代码,那么标量值如何跨步或拉伸或扩展到数组的相同大小以便元素明智它们之间的操作是可能的,
-
我不认为深入研究源代码会对您有所帮助 - 很难遵循 C 代码。但是您可能会发现使用
np.broadcast_to和np.broadcast_arrays(其代码在np.lib.stride_tricks中)很有启发性。注意他们如何操纵strides属性。 -
开发人员一直在尝试将广播迭代合并为一个强大的功能,
nditer。编译后的代码通过 c-api 调用它,但您可以通过np.nditer使用它。我不愿提及它,因为它不是速度工具。但作为一种学习工具,它可能会有所帮助。 -
请注意,
broadcast_to使用了我刚才提到的np.nditer。
标签: python numpy array-broadcasting