配列の外周の値を移動

Move values around the matrix perimeter – Python / NumPy – StackOverflow

うーん,エレガント.

import numpy as np


def move_perimeter(a, n=1, direction='clockwise'):
    # a : input array
    # n : number of elements to be moved
    # direction : 'clockwise' or 'counterclockwise'

    # Dictionary to map for number of elements rolling later
    dirn_map = {'clockwise':n, 'counterclockwise':-n}

    # Store size
    m, n = a.shape
    r0 = np.arange(m-1)
    r1 = np.arange(n-1)

    # Get Top, Right, Bottom and Left side linear indices. Store those.
    T = r1
    R = n - 1 + r0*n
    B = a.size - r1 - 1
    L = n + r0[::-1]*n
    idx = np.r_[T, R, B, L]

    # Make a copy of input array
    out = a.copy()

    # Linearly index into output array with those original indices
    # and extract rolled values from input array.
    out.ravel()[idx] = a.ravel()[np.roll(idx, dirn_map[direction])]
    return out


a = np.array(
    [
        [83, 13, 27, 13],
        [90, 78, 57, 68],
        [66, 47, 44, 53],
        [13, 98, 95, 46],
        [29, 87, 80, 92],
        [91, 19, 86, 26],
        [31, 27, 75, 72]
    ]
)

move_perimeter(a)

array([[90, 83, 13, 27],
[66, 78, 57, 13],
[13, 47, 44, 68],
[29, 98, 95, 53],
[91, 87, 80, 46],
[31, 19, 86, 92],
[27, 75, 72, 26]])

広告
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中