我正在尝试用基于像素的图像的所有 x 坐标列表填充一个 numpy 数组。所以基本上,一个n x m
图像会有n
1
's,n
2
's,等等直到n
m
's。有没有一种简单的方法来填充一个 numpy 数组,这样就可以了?
到目前为止,我已经考虑过使用numpy.concatenate
,但是必须单独提出每个数组似乎非常乏味,而且无论如何我都会使用循环,这并没有真正的帮助。numpy.flatten
也来找,但我必须先生成网格。有没有简单的解决方案?
总是有通常的网格创建功能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[]
在这种情况下,它会创建自动广播的行和列以覆盖二维网格。他们只使用很少的内存这一事实也可以加快速度(更少的内存访问)。
如果您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
解决方案的扁平化版本。