我想创建一个 2D numpy 数组,我想在其中存储像素的坐标,使 numpy 数组看起来像这样
[(0, 0), (0, 1), (0, 2), ...., (0, 510), (0, 511)
(1, 0), (1, 1), (1, 2), ...., (1, 510), (1, 511)
..
..
..
(511, 0), (511, 1), (511, 2), ...., (511, 510), (511, 511)]
这是一个荒谬的问题,但我还找不到任何东西。
可以使用np.indices
ornp.meshgrid
进行更高级的索引:
>>> data=np.indices((512,512)).swapaxes(0,2).swapaxes(0,1)
>>> data.shape
(512, 512, 2)
>>> data[5,0]
array([5, 0])
>>> data[5,25]
array([ 5, 25])
这可能看起来很奇怪,因为它确实是为了做这样的事情:
>>> a=np.ones((3,3))
>>> ind=np.indices((2,1))
>>> a[ind[0],ind[1]]=0
>>> a
array([[ 0., 1., 1.],
[ 0., 1., 1.],
[ 1., 1., 1.]])
一个mgrid
例子:
np.mgrid[0:512,0:512].swapaxes(0,2).swapaxes(0,1)
网格示例:
>>> a=np.arange(0,512)
>>> x,y=np.meshgrid(a,a)
>>> ind=np.dstack((y,x))
>>> ind.shape
(512, 512, 2)
>>> ind[5,0]
array([5, 0])
所有这些都是等效的方法;但是,meshgrid
可用于创建非均匀网格。
如果您不介意切换行/列索引,您可以删除最终的swapaxes(0,1)
.
你可以np.ogrid
在这里使用。与其存储 a tuple
,不如将其存储在 3D 数组中。
>>> t_row, t_col = np.ogrid[0:512, 0:512]
>>> a = np.zeros((512, 512, 2), dtype=np.uint8)
>>> t_row, t_col = np.ogrid[0:512, 0:512]
>>> a[t_row, t_col, 0] = t_row
>>> a[t_row, t_col, 1] = t_col
这应该可以解决问题。希望您可以使用它,而不是元组。
钦塔克
问题中的示例并不完全清楚 - 缺少额外的逗号或额外的括号。
这个 - 为了清楚起见,示例范围为 3、4 - 为第一个变体提供了解决方案并产生了一个有效的二维数组(如问题标题所示) - “列出”所有坐标:
>>> np.indices((3,4)).reshape(2,-1).T
array([[0, 0],
[0, 1],
[0, 2],
[0, 3],
[1, 0],
[1, 1],
[1, 2],
[1, 3],
[2, 0],
[2, 1],
[2, 2],
[2, 3]])
通过使用 2x 已经在另一个答案中显示了另一个变体.swapaxes()
- 但也可以使用一个np.rollaxis()
(或新的np.moveaxis()
)来完成:
>>> np.rollaxis(np.indices((3,4)), 0, 2+1)
array([[[0, 0],
[0, 1],
[0, 2],
[0, 3]],
[[1, 0],
[1, 1],
[1, 2],
[1, 3]],
[[2, 0],
[2, 1],
[2, 2],
[2, 3]]])
>>> _[0,1]
array([0, 1])
此方法也适用于 N 维索引,例如:
>>> np.rollaxis(np.indices((5,6,7)), 0, 3+1)
注意:np.indices
对于大范围,该功能确实(C 速度)快速。