import numpy as np # この排列をトーラス接続にする numOfRows, numOfCol = 3, 5 a = np.arange(numOfRows * numOfCol).reshape(numOfRows, numOfCol).astype("uint16") # 上下左右をそれぞれスタックし合う方法 def toTorus1(mat): mat = np.array(mat) mat = np.vstack([mat[-1] , np.vstack([mat, mat[0]])]) mat = np.hstack([mat[:,[-1]], np.hstack([mat, mat[:,[0]]])]) return mat # 一回り大きい排列をあらかじめ作っておいてそこに上書きする方法 A = np.empty([numOfRows+2, numOfCol+2]).astype("uint16") def toTorus2(mat, matEnlarged): mat = np.array(mat) numOfRows, numOfCol = mat.shape matEnlarged[1:numOfRows+1,1:numOfCol+1] = mat matEnlarged[0] , matEnlarged[-1] = matEnlarged[-2] , matEnlarged[1] matEnlarged[:,[0]], matEnlarged[:,[-1]] = matEnlarged[:,[-2]], matEnlarged[:,[1]] return matEnlarged if __name__ == "__main__": %timeit toTorus1(a) %timeit toTorus2(a, A) print(a) print(toTorus1(a)) print(toTorus2(a, A))
実行結果: