我正在尝试使用基于像素的图像的所有x坐标列表来填充numpy数组。所以基本上,n x m
图片会有n
1
个,n
2
,依此类推,直至n
{{ 1}}的。是否有一种简单的方法来填充numpy数组,以便这种情况?
到目前为止,我已经考虑过使用m
,但是单独提出每个数组看起来非常繁琐,而且无论如何我都会使用循环,这实际上没有用。 numpy.concatenate
也会找到,但我必须先生成网格。有没有简单的解决方案?
答案 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)
更简单,如果m
和n
是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
(另一种选择是将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
解决方案的扁平化版本。