【发布时间】:2018-01-23 18:13:15
【问题描述】:
假设我有一个形状为(m, n) 的二维numpy 数组A。我想创建一个形状为(m, n, k) 的3D 数组B,这样B[:, :, l] 是任何切片l 的A 的副本。我可以想到两种方法来做到这一点:
np.tile(A, (m, n, k))
或
np.repeat(A[:, :, np.newaxis], k, axis=-1)
第一种方法似乎更简单,但我在np.tile 的文档中提到:
Note: Although tile may be used for broadcasting, it is strongly
recommended to use numpy's broadcasting operations and functions.
为什么会这样,np.repeat 也有这个问题吗?
我的另一个担心是,如果m == n == k,那么np.tile() 是否会在增强哪个轴方面造成混淆?
总的来说,我有两个问题:
- 为什么
np.tile不是首选,m == n == k在某些情况下会导致意外行为? - 上述两种方式中哪一种在时间和内存方面效率更高?有没有比这两种方法更清洁或更有效的方法?
【问题讨论】:
-
您的
np.tile呼叫没有执行您想要执行的操作。np.tile不能那样做;它需要重复计数,而不是新形状,并且不会从m、n和k的值中猜测如何将旧形状与新形状对齐。 -
Look at the code fortile. It uses a reshape plusrepeat.repeat`是编译后的函数。 -
收到
B后会做什么? (该问题的答案首先有助于告知构建B的选项。) -
@MarkDickinson 就我而言,我实际上有一个形状为
(m, n)的数组A1和一个形状为A2的数组(n, k),我想将每个数组扩展为一个 3D 数组塑造(m, n, k)并计算总和数组。 -
@Hilbert:如果此扩展的目的是计算总和数组,那么您不需要存储物理扩展的数组。广播就足够了。
标签: python arrays numpy broadcasting