最快的方法来创建元素在范围内的2D numpy数组

时间:2013-08-21 14:06:49

标签: 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)]

这是一个荒谬的问题但我找不到任何东西。

2 个答案:

答案 0 :(得分:9)

可以使用np.indicesnp.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)

答案 1 :(得分:3)

您可以在此处使用np.ogrid。而不是存储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

这应该可以解决问题。希望你可以使用它,而不是元组。

Chintak