2017-10-15 121 views
0

我正在編寫使用笛卡爾方法和三角函數在平面上移動,調整大小和旋轉形狀以及跟蹤和報告這些惡作劇的python代碼。在Python中處理座標的最合適的變量類型

它不會計算密集型 - 通常用戶指令會導致單個移動/旋轉/調整大小操作。

我想知道什麼是用於形狀座標和尺寸對的最合適的變量類型,以及爲什麼。

我考慮的類型是

x = 10 
y = -15 

list_coords = [x, y] 
tuple_coords = (x, y) 

import numpy as np 
array_coords = np.array([x, y]) 

import cmath as cm 
complex_coords = x + j*y 

如果你知道其他好的選擇,也請告訴我這件事。

謝謝!

回答

2

短的答案,元組

從 「What's the difference between lists and tuples?」 線程,

元組是異質的數據結構(即,它們的條目具有 不同的含義),而列表是均勻序列。

元組有結構,列表有順序。 使用這種區別使代碼更加明確和易於理解。

由於元組由異構實體組成,而不是homogeius實體的順序,所以元組是處理座標系的好方法。另外,像元組一樣的座標操作相當簡單。

實施例:

import operator 
a = (1,2,3) 
b = (5,6,7) 
c = tuple(map(operator.add, a, b)) 

此外元組是不可變的。起初這似乎很不方便,但在函數式編程技術中使用這樣的不可變數據具有很多優點。

+1

謝謝,我的直覺也告訴我一個元組聽起來很正確,但我對(a)不瞭解可以做的地圖/操作符類的東西,(b)正如你所說的,有點偏離了事實我不能做tuple_coord [0] = 12.但是我開始認爲這種不便類型 - 反映了座標的本質,因爲它們是相關的,如果一個操作可以改變它,它幾乎總是可能改變另一個。 – levraininjaneer

0

很多選擇。考慮一個多邊形。在大多數GIS程序的第一和最後點被重複以形成封閉,如在多邊形「一」以下,使用numpy的

import numpy as np 
a = np.array([[0., 0.], [0., 1000.], [1000., 1000.], [1000., 0.], [ 0., 0.]]) 
a 
array([[ 0.,  0.], 
     [ 0., 1000.], 
     [ 1000., 1000.], 
     [ 1000.,  0.], 
     [ 0.,  0.]]) 

用於上述的D型細胞是一個簡單的float64。您可以通過如下分配適當的數據類型轉換爲結構化數組:

b = np.zeros((a.shape[0]), dtype=[('Xs', '<f8'), ('Ys', '<f8')]) 
b['Xs'] = a[:,0]; b['Ys'] = a[:,1] 
b 
array([(0.0, 0.0), (0.0, 1000.0), (1000.0, 1000.0), (1000.0, 0.0), (0.0, 0.0)], 
     dtype=[('Xs', '<f8'), ('Ys', '<f8')]) 

你可以走一步,產生「recarray」如果你喜歡使用object.property符號與你的對象。

c = b.view(np.recarray) 

與均勻D型的標準陣列中,可以訪問使用切片的X值,其中添加通過柱名切片的能力的結構化陣列,最後,與可以使用對象的recarray。財產表示法。

args = [a[:,0], b['Xs'], c.Xs] # ---- get the X coordinates 
print('{}\n{}\n{}'.format(*args)) 
[ 0.  0. 1000. 1000.  0.] 
[ 0.  0. 1000. 1000.  0.] 
[ 0.  0. 1000. 1000.  0.] 

您可以在陣列中得到的唯一點的多邊形質心..

np.mean(a[:-1], axis=0) 
array([ 500., 500.]) 

其實很容易從一個數組獲得獨特的分給予正確的形式

np.unique(b) 

array([(0.0, 0.0), (0.0, 1000.0), (1000.0, 0.0), (1000.0, 1000.0)], 
     dtype=[('Xs', '<f8'), ('Ys', '<f8')]) 

您可能已經注意到,我在傳統的ndarrays之間來回切換,那些帶有命名字段和recarrays的。那是因爲你可以使用相同的數據,只要你喜歡,就可以用不同的方式查看它。