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

17

我想创建一个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)]

这是一个荒谬的问题,但我还没有找到任何答案。


你的格式看起来像是想要一个形状为(512,512,2)的三维数组...但你给出的语法标记是一个形状为(512 * 512,2)的二维数组。你能澄清一下吗? - lmjohns3
3个回答

12

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

一个meshgrid的例子:

>>> 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)


3

问题中的示例不是完全清楚的 - 可能缺少额外的逗号或括号。

以下是一个例子,为了更清晰地说明,范围为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语言速度)。

3

您可以在此处使用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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接