如何在numpy中创建一个增加的多维数组

Jam*_* L. 4 python arrays opencv numpy

我试图在给出单应矩阵的情况下执行逆变形,为了有效地做到这一点,我需要一个看起来像这样的numpy数组:

([[0, 0, 1], [0, 1, 1], [0, 2, 1], ... [1, 0, 1], [1, 1, 1], ... [n, p, 1]])
Run Code Online (Sandbox Code Playgroud)

其中n是图像的宽度(im.shape[0]),p是图像的高度(im.shape[1]).关于如何有效地构建看起来那样的numpy数组的任何想法?

编辑:

有一些讨论哪个是最快的,如果有人有任何信息,我认为听起来很有趣.我感谢大家的帮助!

Div*_*kar 5

使用indices_merged_arr_generic_using_cp@unutbu -

def indices_one_grid(n,p):
    ar = np.ones((n,p),dtype=int)
    return indices_merged_arr_generic_using_cp(ar)
Run Code Online (Sandbox Code Playgroud)

样品运行 -

In [141]: indices_one_grid(n=3,p=4)
Out[141]: 
array([[0, 0, 1],
       [0, 1, 1],
       [0, 2, 1],
       [0, 3, 1],
       [1, 0, 1],
       [1, 1, 1],
       [1, 2, 1],
       [1, 3, 1],
       [2, 0, 1],
       [2, 1, 1],
       [2, 2, 1],
       [2, 3, 1]])
Run Code Online (Sandbox Code Playgroud)

标杆

其他方法 -

def MSeifert(n,p):
    x, y = np.mgrid[:n, :p]
    return np.stack([x.ravel(), y.ravel(), np.ones(x.size, dtype=int)], axis=1)

def DanielF(n,p):
    return np.vstack([np.indices((n,p)), np.ones((1, n,p))]).reshape(3,-1).T

def Aaron(n,p):
    arr = np.empty([n*p,3])
    arr[:,0] = np.repeat(np.arange(n),p)
    arr[:,1] = np.tile(np.arange(p),n)
    arr[:,2] = 1
    return arr
Run Code Online (Sandbox Code Playgroud)

计时 -

In [152]: n=1000;p=1000

In [153]: %timeit MSeifert(n,p)
     ...: %timeit DanielF(n,p)
     ...: %timeit Aaron(n,p)
     ...: %timeit indices_one_grid(n,p)
     ...: 
100 loops, best of 3: 15.8 ms per loop
100 loops, best of 3: 8.46 ms per loop
100 loops, best of 3: 10.4 ms per loop
100 loops, best of 3: 4.78 ms per loop
Run Code Online (Sandbox Code Playgroud)

  • 令人敬畏的基准测试.感谢您的深入回复! (4认同)