【发布时间】:2013-10-14 15:50:20
【问题描述】:
我正在尝试编写一个函数,该函数将在 2d 数组中创建一个 5 x 5 像素的规则网格。我希望numpy.arange 和numpy.repeat 的某种组合可以做到这一点,但到目前为止我还没有运气,因为numpy.repeat 只会在同一行重复。
这是一个例子:
假设我想要在形状为(20, 15) 的二维数组内有一个 5x5 网格。它应该看起来像:
array([[ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
[ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
[ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
[ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
[ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
[ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5],
[ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5],
[ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5],
[ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5],
[ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5],
[ 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8],
[ 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8],
[ 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8],
[ 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8],
[ 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8],
[ 9, 9, 9, 9, 9,10,10,10,10,10,11,11,11,11,11],
[ 9, 9, 9, 9, 9,10,10,10,10,10,11,11,11,11,11],
[ 9, 9, 9, 9, 9,10,10,10,10,10,11,11,11,11,11],
[ 9, 9, 9, 9, 9,10,10,10,10,10,11,11,11,11,11],
[ 9, 9, 9, 9, 9,10,10,10,10,10,11,11,11,11,11]])
我意识到我可以简单地使用循环和切片来完成此操作,但我可能会将其应用于非常大的数组,我担心其性能会太慢或不切实际。
谁能推荐一个方法来完成这个?
提前致谢。
更新:
提供的所有答案似乎都很好。谁能告诉我哪个对大型阵列最有效?大数组是指100000 x 100000 或更多15 x 15 网格单元大小。
【问题讨论】:
-
这里有两种解决方案,一种涉及
numpy.kron,一种涉及numpy.repeat:stackoverflow.com/questions/7525214/how-to-scale-a-numpy-array -
我在这里发布了一个答案,但事实证明它与您链接问题中使用的@NPE方法相同。
-
@Brionius -
numpy.kron绝对有效。你认为这和@Mr. 之间有很大的性能差异吗? E的答案? -
输出数组在你的问题中占主导地位,所以差异会很小。如果大小为
(m, n),单元格为(d, d),则E先生构建两个大小为(m,)和(n,)的数组,并执行m * n加法。我的解决方案创建了一个数组(m * n / d / d,)并且不执行其他操作。我的猜测是,对于较大的m和n和相对较小的d,E 先生的解决方案会更快、更高效,但不会很多。通过查看source code,我很确定np.kron的表现会更差。