创建一个数组,其中每个元素存储其索引

2024-05-03 03:26:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个2dnumpy数组,其中每个元素都是其索引的元组。

示例(4x5):

array([[[0, 0],
        [0, 1],
        [0, 2],
        [0, 3],
        [0, 4]],

       [[1, 0],
        [1, 1],
        [1, 2],
        [1, 3],
        [1, 4]],

       [[2, 0],
        [2, 1],
        [2, 2],
        [2, 3],
        [2, 4]],

       [[3, 0],
        [3, 1],
        [3, 2],
        [3, 3],
        [3, 4]]])

我将创建一个python list,其中包含以下列表:

^{pr2}$

有没有一种更快的方法来达到同样的效果,也许是用裸体的方法?


Tags: 方法元素示例列表数组arraylist元组
3条回答

为此,您可以滥用numpy.mgrid或{}:

>>> import numpy as np
>>> np.mgrid[:4,:5].transpose(1,2,0)
array([[[0, 0],
        [0, 1],
        [0, 2],
        [0, 3],
        [0, 4]],

       [[1, 0],
        [1, 1],
        [1, 2],
        [1, 3],
        [1, 4]],

       [[2, 0],
        [2, 1],
        [2, 2],
        [2, 3],
        [2, 4]],

       [[3, 0],
        [3, 1],
        [3, 2],
        [3, 3],
        [3, 4]]])

你这样做是因为你需要它还是仅仅为了运动?在前一种情况下:

np.moveaxis(np.indices((4,5)), 0, -1)

np.indices正是它的名字所暗示的。只是它的坐标轴和你不同。所以我们用moveaxis移动它们

正如@Eric指出的,这种方法的一个吸引人的特性是,它可以在任意数量的维度上工作而不受修改:

^{pr2}$

这是一个基于初始化的方法-

def create_grid(m,n):
    out = np.empty((m,n,2),dtype=int) #Improvement suggested by @AndrasDeak
    out[...,0] = np.arange(m)[:,None]
    out[...,1] = np.arange(n)
    return out

样本运行-

^{pr2}$

到目前为止在(4,5)网格和更大尺寸上发布的所有方法的运行时测试-

In [111]: %timeit np.moveaxis(np.indices((4,5)), 0, -1)
     ...: %timeit np.mgrid[:4, :5].swapaxes(2, 0).swapaxes(0, 1)
     ...: %timeit np.mgrid[:4,:5].transpose(1,2,0)
     ...: %timeit create_grid(4,5)
     ...: 
100000 loops, best of 3: 11.1 µs per loop
100000 loops, best of 3: 17.1 µs per loop
100000 loops, best of 3: 17 µs per loop
100000 loops, best of 3: 2.51 µs per loop

In [113]: %timeit np.moveaxis(np.indices((400,500)), 0, -1)
     ...: %timeit np.mgrid[:400, :500].swapaxes(2, 0).swapaxes(0, 1)
     ...: %timeit np.mgrid[:400,:500].transpose(1,2,0)
     ...: %timeit create_grid(400,500)
     ...: 
1000 loops, best of 3: 351 µs per loop
1000 loops, best of 3: 1.01 ms per loop
1000 loops, best of 3: 1.03 ms per loop
10000 loops, best of 3: 190 µs per loop

相关问题 更多 >