用显坐标做数学的便利班
coordinates的Python项目详细描述
坐标
处理需要数学和显式排序的坐标的便利类。
支持Python3.4+
动机
Numpy数组非常适合用存储为数组的坐标进行数学运算
dict非常适合处理顺序不断变化的坐标系 (例如,在c和fortran顺序之间)。
但如果你两者都想要呢?
(注意:如果你在做很多数学题坚持numpy
)
安装
pip install coordinates
用法
Coordinate
s是Mapping
s(即dict
样)。它们不会暴露出突变的界面,但是
我们都是成年人,所以如果你真的想修改内部的_dict
,我不会
阻止你。
实例化
它们可以以dict
可以(从另一个Mapping
,成对序列,
一些关键字参数,或上述参数的混合)。
fromcoordinatesimportCoordinateCoordinate({'x':1,'y':2})Coordinate({'x':1},y=2)Coordinate([('x',1),('y',2)])Coordinate(x=1,y=2)
如果定义了一个订单(稍后将详细介绍),您还可以从一个
参数,它是一个序列,或者来自一个*args
数字。
Coordinate([1,2],order='xy')Coordinate(1,2,order='xy')Coordinate.default_order='xy'Coordinate([1,2])Coordinate(1,2)<^ >因为^ {CD3>}s可以从其他^ {< CD3>}s实例化,所以可以“扩展”现有坐标。 进入新的维度。
coord_2d=Coordinate(x=1,y=2)coord_3d=Coordinate(coord_2d,z=3)
最后,许多Coordinate
可以使用from_sequence
:
Coordinate.from_sequence([(1,2,3),(3,4,5)],order='xyz')Coordinate.from_sequence([{'x':1,'y':2},{'x':3,'y':4}],z=10)
注意:
order
依赖的实例化与**kwargs
不兼容- 从元组序列的实例化在2d中将失败,因为它将被解释为
键值对。在这里使用理解:
Coordinate.from_sequence(zip('xy', row) for row in sequence)
数学
坐标做数学就像你期望的那样,另一个操作数和dict一样。 有相同的钥匙,或号码。
coord=Coordinate(x=1,y=2,z=3)coord*2==Coordinate(x=2,y=4,z=6)>>>Truecoord**2==Coordinate(x=1,y=4,z=9)>>>Truecoord+coord==Coordinate(x=2,y=4,z=3)>>>Truecoord+=1# coord is a reference to a new object; no mutationcoord==Coordinate(x=2,y=3,z=4)>>>Trueabs(Coordinate(x=-10,y=10))==Coordinate(x=10,y=10)>>>Trueimportmathmath.ceil(Coordinate(x=0.5))==Coordinate(x=1)>>>Truemath.floor(Coordinate(x=0.5))==Coordinate(x=0)>>>True
它们也有一些方便的方法来获得密钥的和、积或范数。
coord.sum()==9>>>Truecoord.prod()==24>>>TrueCoordinate(x=3,y=4).norm(order=2)==5>>>True
订购
您可以按特定顺序获取Coordinate
的键、值或项:
coord.to_list('yxz')==[2,1,3]>>>Truelist(coord.items('yxz'))==[('y',2),('x',1),('z',3)]>>>True
单个实例的默认顺序可以在实例化时给定,也可以进行变异(这不影响相等性)。
可以在类上设置所有Coordinate
的默认顺序这会影响现有实例,但不会
如果是显式设置,则重写它们的顺序。
如果没有设置实例^ {< CD14>}或类^ {CD20>},则返回到反向词典编纂。
coord3=Coordinate(x=1,y=2,z=3,order='zxy')coord3.order='yzx'Coordinate.default_order='xyz'
子类化
如果您在一个空间中工作,spaced_coordinate
工厂可以使用一组固定的
键和可选的默认顺序。
fromcoordinatesimportspaced_coordinateCoordinateXYZC=spaced_coordinate('CoordinateXYZC','xyzc')# this will raise a ValueErrorCoordinateXYZC(x=1,y=2,z=3)
或者您可以直接对Coordinate
进行子类划分。
价值访问
可以使用类似dict的语法(coord['x']
,coord.get('y', 2)
)访问坐标值,或者为了方便起见,
如果键是字符串,则为类似(coord.z
)的属性。
注
如果不希望其他应用程序使用与订单相关的功能,基类MathDict
在这里也实现了。