numpy.arange返回的多个数组副本?

时间:2013-05-26 02:21:49

标签: python numpy

我正在尝试使用基于像素的图像的所有x坐标列表来填充numpy数组。所以基本上,n x m图片会有n 1个,n 2,依此类推,直至n {{ 1}}的。是否有一种简单的方法来填充numpy数组,以便这种情况?

到目前为止,我已经考虑过使用m,但是单独提出每个数组看起来非常繁琐,而且无论如何我都会使用循环,这实际上没有用。 numpy.concatenate也会找到,但我必须先生成网格。有没有简单的解决方案?

2 个答案:

答案 0 :(得分:4)

始终存在通常的网格创建功能mgrid()

x_coords = numpy.mgrid[:m, :n][0]+1  # [[1, 1, 1…], [2, 2, 2,…]]. Element 1 is instead: [[1, 2, 3,…], [1, 2, 3,…]]

(PS:DSM的numpy.indices(image.shape)更简单,如果mnimage的维度。)

如果需要浮点坐标,那么更通用的“复杂步骤”形式会以有效的方式提供它们

numpy.mgrid[:m:(m+1)*1j, :n:(n+1)*1j]  # m+1 values from 0 to m, n+1 values from 0 to n

(另一种选择是将float 1.添加到第一个表单,但这会不必要地首先创建一个整数数组。)

如果你只需要一个坐标,这有点浪费,因为mgrid[]也为另一个坐标创建一个类似的网格(mgrid[]有两个元素,这里)。

在某些情况下,使用内存不足 numpy.ogrid[]可能更有效,在这种情况下,会创建一个自动广播的行和列,以便覆盖二维网格。他们只使用很少的内存这一事实也可以加快速度(减少内存访问)。

答案 1 :(得分:3)

如果您的image.shape(n, m),则x坐标为:

np.repeat(np.arange(m), n)

例如:

In [5]: n, m = 4, 3

In [6]: np.repeat(np.arange(m), n)
Out[6]: array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2])

当然,y-coords将是

np.repeat(np.arange(n), m)

您可能希望使用np.tile代替第二个坐标:

np.tile(np.arange(n), m)

然后,您可以压缩它并为所有像素设置坐标:

In [9]: np.repeat(np.arange(m), n)
Out[9]: array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2])

In [10]: np.tile(np.arange(n), m)
Out[10]: array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3])

请注意,这基本上是EOL mgrid解决方案的扁平化版本。