2017-02-23 43 views
0

我有一個2D座標列表作爲NumPy數組,例如,帶滾動二維數組的zip壓縮版相當於

x = np.asarray([[0, 1], 
       [1, 2], 
       [2, 3]]) 

形狀(3,2)

現在我想壓縮這個陣列np.roll(x, 1)獲得座標對之間(包括最近的第一個元素就行了。行的順序無關緊要畫線。

我已經發現與標準Python拉鍊的解決方案:

>>> np.asarray(list(zip(list(x[-1:]) + list(x[:-1]), x))) 
array([[[2, 3], 
     [0, 1]], 
     [[0, 1], 
     [1, 2]], 
     [[1, 2], 
     [2, 3]]]) 

我如何使用numpy的功能,而無需轉換到Python的列表,以便獲得這個結果

我嘗試迄今在與NumPy的做失敗瀨rably,例如:

>>> np.dstack([x, np.roll(x, 1)]) 
array([[[0, 3], 
     [1, 0]], 

     [[1, 1], 
     [2, 1]], 

     [[2, 2], 
     [3, 2]]]) 

編輯:這不是試圖與任何其他陣列創建的X組合所以建議重複不是重複。

回答

1

我不明白爲什麼這是你想要的輸出,但這裏是你想獲得dstack版本:

>>> np.transpose(np.dstack([np.roll(x, 1, axis=0), x]), axes=(0,2,1)) 
array([[[2, 3], 
     [0, 1]], 

     [[0, 1], 
     [1, 2]], 

     [[1, 2], 
     [2, 3]]]) 
+0

謝謝!我完全錯過了「斧頭」選項。輸出是指「從(2,3)到(0,1)畫線,從(0,1)到(1,2)等畫線」。如果x包含多邊形的所有點,則將繪製該多邊形。 –

+1

我傳遞軸轉置,而不是dstack。 – wim

+0

哦......這就是爲什麼我想念它:-)謝謝。當然,我從中學到了一些東西! –

1

下面是創建這樣捲起指數,然後索引的方法 -

In [18]: x   # Input array 
Out[18]: 
array([[0, 1], 
     [1, 2], 
     [2, 3]]) 

In [19]: n = x.shape[0] 

In [20]: x[np.mod(np.arange(n)[:,None] + [n-1,0],n)] 
Out[20]: 
array([[[2, 3], 
     [0, 1]], 

     [[0, 1], 
     [1, 2]], 

     [[1, 2], 
     [2, 3]]])