3

我正在尝试用基于像素的图像的所有 x 坐标列表填充一个 numpy 数组。所以基本上,一个n x m图像会有n 1's,n 2's,等等直到n m's。有没有一种简单的方法来填充一个 numpy 数组,这样就可以了?

到目前为止,我已经考虑过使用numpy.concatenate,但是必须单独提出每个数组似乎非常乏味,而且无论如何我都会使用循环,这并没有真正的帮助。numpy.flatten也来找,但我必须先生成网格。有没有简单的解决方案?

4

2 回答 2

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,…]]

numpy.indices(image.shape)(PS:如果m并且n是 的维度,则DSM更简单image。)

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

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

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

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

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

于 2013-05-26T02:27:46.493 回答
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坐标是

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])

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

于 2013-05-26T02:50:27.547 回答