创建元素在范围内的二维numpy数组的最快方法

创建元素在范围内的二维numpy数组的最快方法,numpy,range,Numpy,Range,我想创建一个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)] 这是一个荒谬的问题,但我还找不到任何东西。可以使用或进行更高

我想创建一个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)]
这是一个荒谬的问题,但我还找不到任何东西。

可以使用或进行更高级的索引:

>>> 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.]])
A
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
可用于创建非均匀网格


如果您不介意切换行/列索引,您可以删除最后的
swapax(0,1)
您可以在此处使用
np.ogrid
。不要存储
元组
,而是将其存储在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
这应该能奏效。希望您可以使用它,而不是元组


Chintak

问题中的示例并不完全清楚-要么缺少额外的逗号,要么是额外的制动器

这一示例(为清晰起见,范围为3、4)为第一个变量提供了解决方案,并生成了一个有效的2D数组(如问题标题所示)-“列出”所有坐标:

>>> 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()
)来完成:

此方法也适用于N维索引,例如:

>>> np.rollaxis(np.indices((5,6,7)), 0, 3+1)

注意:函数
np.索引确实(C-speed)在大范围内工作得很快。

按照您的格式化方式,看起来您需要一个形状(512、512、2)的3D数组。。。但是您给出的语法标记是针对二维形状数组(512*512,2)。你能澄清一下吗?
>>> np.rollaxis(np.indices((5,6,7)), 0, 3+1)