python中处理坐标的最合适的变量类型

python中处理坐标的最合适的变量类型,python,numpy,types,coordinates,complex-numbers,Python,Numpy,Types,Coordinates,Complex Numbers,我正在编写python代码,它使用笛卡尔方法和三角法来移动、调整和旋转平面上的形状,并跟踪和报告这些诡计 它不会占用大量计算时间-通常,用户指令会导致单个移动/旋转/调整大小操作 我想知道形状坐标和尺寸对最合适的变量类型是什么,以及为什么 我考虑过的类型是 x = 10 y = -15 list_coords = [x, y] tuple_coords = (x, y) import numpy as np array_coords = np.array([x, y]) import cm

我正在编写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
如果你知道其他好的选择,也请告诉我


谢谢

简短回答,元组

从“”线程

元组是异构数据结构(即,它们的条目具有 不同的含义),而列表是同质序列

元组有结构,列表有顺序。 使用这种区别可以使代码更加明确和易懂

由于元组是由异构实体组成的,因此元组是处理坐标系的一种很好的方法,而不是由同态实体的顺序组成。此外,对于元组,坐标运算(如加法和减法)也相当简单

例如:

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

元组也是不可变的。一开始这似乎不方便,但在函数式编程技术中使用这样的不可变数据有很大的优势。

简短回答,Tuple

从“”线程

元组是异构数据结构(即,它们的条目具有 不同的含义),而列表是同质序列

元组有结构,列表有顺序。 使用这种区别可以使代码更加明确和易懂

由于元组是由异构实体组成的,因此元组是处理坐标系的一种很好的方法,而不是由同态实体的顺序组成。此外,对于元组,坐标运算(如加法和减法)也相当简单

例如:

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

元组也是不可变的。起初这似乎不方便,但在函数式编程技术中使用这样的不可变数据有很大的优势。

有很多选择。考虑多边形。在大多数GIS程序中,第一个点和最后一个点被重复以形成闭合,如下面使用numpy的多边形“a”

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.]])
上面的数据类型是一个简单的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')])
对于具有统一数据类型的标准数组,您可以使用切片来访问X值,对于结构化数组,您可以添加按列名切片的功能,最后,对于recarray,您可以使用object.property表示法

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')])
np.unique(b)
数组([(0.0,0.0),(0.0,1000.0),(1000.0,0.0),(1000.0,1000.0)],

dType = [(xs),'p>许多选项。考虑多边形。在大多数GIS程序中,第一个和最后一个点被重复以形成闭合,如在下面的多边形A’中使用NUMPY < /P>
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.]])
上面的数据类型是一个简单的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')])
对于具有统一数据类型的标准数组,您可以使用切片来访问X值,对于结构化数组,您可以添加按列名切片的功能,最后,对于recarray,您可以使用object.property表示法

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')])
np.unique(b)
数组([(0.0,0.0),(0.0,1000.0),(1000.0,0.0),(1000.0,1000.0)],

dtype=[('Xs','谢谢,我的直觉也告诉我元组听起来不错,但我(a)不知道你能做的映射/运算符之类的事情,(b)正如你所说,我不能做元组[0]这一事实让我有点犹豫=12.但我开始认为这种不便反映了坐标的本质,因为坐标是相关的,如果一个操作可以改变一个,它几乎总是可能改变另一个。谢谢,我的直觉也告诉我元组听起来是对的,但我是(a)不知道你可以做的映射/操作符之类的事情,(b)如你所说,我不能做tuple_coord[0]这一事实让我有点犹豫但是我开始认为这种不便反映了坐标的本质,因为它们是相关的,如果一个操作可以改变一个,那么它几乎总是可能改变另一个。