2017-10-15 6 views
0

私はデカルト法と三角法を使って飛行機のシェイプを移動、サイズ変更、回転させ、これらのシナリオを追跡し報告するPythonコードを書いています。Pythonの座標を扱うのに最も適切な変数型

通常、ユーザー命令は、1回の移動/回転/サイズ変更操作につながります。

形状の座標と寸法の組み合わせに使用する最も適切な変数の種類とその理由を知りたいと思います。

私が考えたのタイプは、あなたが他の良いオプションを知っている場合、また、それについて教えてください

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?" スレッド、

タプルからリストが均質な配列でありながら、異種のデータ構造(すなわち、そのエントリは 異なる意味を持っている)です。

タプルは構造を持ち、リストには順序があります。 この区別を使用すると、コードがより明示的かつ理解しやすくなります。

タプルは、ホモジエスエンティティの順序ではなく、異種エンティティで構成されているため、タプルは座標系を処理するうえで最適な方法です。また、追加の&のような座標演算はタプルでかなり簡単です。

例:

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プログラムの最初と最後の点は、多角形のような「」上記ためDTYPEは簡単のfloat64ある

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.]]) 

をnumpyの使用下に、クロージャを形成するために繰り返されます。あなたは次のように適切なデータ型を割り当てることによって、構造化された配列に変換することができます

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')]) 

あなたはさらに一歩進めて、あなたのオブジェクトとobject.property表記法を使用することを好む場合は、「recarray」を生成することができます。均一なDTYPEと標準配列で

c = b.view(np.recarray) 

、あなたはあなたがオブジェクトを使用することができますrecarrayで、最終的には列名によってスライス、および能力を追加し、構造配列と、スライスを使用してXの値にアクセスすることができます。プロパティ表記法。

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')]) 
指定された配列からのユニークなポイントを獲得することは容易です

あなたは、従来のndarray、名前付きフィールドと再配列を持つものの間を行き来していることに気づいたかもしれません。これは、同じデータを使用し、必要に応じてさまざまな方法で見ることができるからです。

関連する問題