2017-10-15 123 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的。那是因为你可以使用相同的数据,只要你喜欢,就可以用不同的方式查看它。