独立移动数组中的行

Kev*_*vin 6 python arrays numpy

我想按行号移动每一行,并与我想要的输出形状相关。一个例子:

array([[0, 1, 2],        array([[0, 1, 2],                array([[0, 1, 2, 0, 0],
       [1, 2, 3],    ->            [1, 2, 3],      ->            [0, 1, 2, 3, 0],
       [2, 3, 4]])                    [2, 3, 4]])                [0, 0, 2, 3, 4])
Run Code Online (Sandbox Code Playgroud)

最左边的数组是我的输入,最右边的数组是我想要的输出。这可以推广到更大的数组,例如10x10数组。

有没有很好的方法来做到这一点?


我所拥有的是:

A = np.array([[1, 2, 3],
              [2, 3, 4],
              [3, 4, 5]], dtype=np.float32)

out = np.zeros((A.shape[0], A.shape[1]*2-1))

out[[np.r_[:3]], [np.r_[:3] + np.r_[:3][:,None]]] = A
Run Code Online (Sandbox Code Playgroud)

Pie*_*e D 2

这里有一个快速的方法:

\n
def f(a):\n    r, _ = a.shape\n    return np.c_[a, np.zeros((r, r), dtype=a.dtype)].ravel()[:-r].reshape(r, -1)\n
Run Code Online (Sandbox Code Playgroud)\n

例子:

\n
a = np.arange(8).reshape(4, -1)\n>>> f(a)\narray([[0, 1, 0, 0, 0],\n       [0, 2, 3, 0, 0],\n       [0, 0, 4, 5, 0],\n       [0, 0, 0, 6, 7]])\n
Run Code Online (Sandbox Code Playgroud)\n

定时

\n
a = np.random.randint(100, size=(1000, 1000))\n%timeit f(a)\n# 2.08 ms \xc2\xb1 14.5 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n