2017-07-02 26 views
0

我不確定搜索關鍵字是什麼,所以如果它已經被問到,請鏈接迴應並關閉此主題。如何翻譯/移動一個numpy數組?

我試圖通過一個固定的方向以一個numpy的陣列的非零項移位,例如,想象我有一個二維數組:

0 1 2 0 
0 3 0 0 
0 0 0 0 
0 0 0 0 

通過移位它(1,1)將產生下面的數組:

0 0 0 0 
0 0 1 2 
0 0 3 0 
0 0 0 0 

比方說,如果非零項超出邊界,他們只是簡單地丟棄。我該怎麼做?

編輯:aparently從這個重複嗎? Shift elements in a numpy array 我真的不明白他們爲什麼是同一個問題,因爲那個人談論的是循環出來的事情,所以它更多的是「滾動」而不是移動。我也喜歡這裏的解決方案,它非常簡單易讀。

再次編輯:修正了一些格式

+1

除邊緣行爲外,您可能正在尋找'np.roll'。你也可以從一個片斷構建一個新的數組。 –

+0

請編輯你的值爲1,2,3而不是2,2,2,這樣我們可以看到你想要什麼樣的換檔,現在可以有很多不同的事情 –

+0

'shift =(1,1);新= np.zeros_like(舊);新的[shift [0]:,shift [1]:] = old [: - shift [0],: - shift [1]]給出或帶來幾個錯誤的錯誤。 –

回答

1

要簡單管理的邊緣,你可以在一個更大的放大你的數組:

square=\ 
array([[0, 2, 2, 0], 
     [0, 2, 0, 0], 
     [0, 0, 0, 0], 
     [0, 0, 0, 0]], dtype=int64) 

n,m=square.shape 
bigsquare=np.zeros((3*n,3*m),square.dtype) 
bigsquare[n:2*n,m:2*m]=square 

然後按住Shift鍵只是一個觀點:

def shift(dx,dy): 
    x=n-dx 
    y=m-dy 
    return bigsquare[x:x+n,y:y+m] 

print(shift(1,1)) 

#[[0 0 0 0] 
# [0 0 2 2] 
# [0 0 2 0] 
# [0 0 0 0]] 
+0

這是一個副本的視圖,它不是特別的信息。 –

+0

@AndrasDeak啊我不打算在任何地方編輯,複製對我來說很好,因爲我保留了我的大部分功能 –

+0

@EvanPu我知道,你不能真的以任何其他方式做到這一點。我只是反映了B. M.的「轉變只是一種觀點」的評論。 –