用户定义的python Vector类

时间:2013-08-21 23:15:31

标签: python vector multidimensional-array precision performance

我一直在寻找一种方法来处理python中的向量,并且没有在这里或在完全适合我的文档中找到解决方案。

到目前为止,这是我为矢量类提出的:

class vec(tuple):

    def __add__(self, y):
        if len(self)!=len(y):
            raise TypeError
        else:
            ret=[]
            for i,entry in enumerate(self):
                ret.append(entry+y[i])
            return vec(ret)

    def __mul__(self, y):
        t=y.__class__
        if t == int or t==float:
            #scalar multiplication
            ret=[]
            for entry in self:
                ret.append(y*entry)
            return vec(ret)
        elif t== list or t==tuple or t==vec:
            # dot product
            if len(y)!=len(self):
                print 'vecs dimensions dont fit'
                raise TypeError
            else:
                ret=0
                for i,entry in enumerate(self):
                    ret+=entry*y[i]
            return ret

Theres稍微多了一些,因为要做的事情很简单。 到目前为止,每个人都工作正常,但我有很多微小的具体问题(并且可能会在发布时发布更多):

  1. 是否有数字和序列类型的基类以及如何解决它们?
  2. 如何让所有这些更多的Python-y?我想学习如何编写优秀的Python代码,所以如果你发现效率低下或丑陋的东西,请告诉我。
  3. 精度怎么样?由于python似乎只在必要时从整数转换为浮点数,因此输入和输出通常是相同的类型。所以可能存在大数或小数的问题,但我现在并不需要那些。我一般都会担心精确度,还是python会为我做这件事?自动转换为最大可能类型会更好吗?那是哪一个?除此之外会发生什么?
  4. 我想在涉及大量矢量方程和函数的项目中使用n维向量,我希望能够使用数学教科书中常用的符号。正如您所看到的,这继承自元组(为了便于构造,不变性和索引),并且为了使用(+, - ,*,..) - 运算符,大多数内置函数都被覆盖。它们仅在左操作数是vec时才起作用(我可以更改吗?)。乘法包括点和标量乘积,如果两个vecs都是3D,则pow也用于交叉乘积。

    测试脚本:

    def testVec():
        rnd=random.Random()        
        for i in range(0,10000):
            a=utils.vec((rnd.random(),rnd.random(),rnd.random()))
            ### functions to test
            a*(a*a)           
            ###
    
    
    def testNumpy():
        rnd=random.Random()        
        for i in range(0,10000):
            a=np.array((rnd.random(),rnd.random(),rnd.random()))
            ###
            a.dot(a)*a
            ###
    cProfile.run('testNumpy()')
    

    - >在0.135秒内进行50009次函数调用

    cProfile.run('testVec()')
    

    - > 100009函数调用0.064秒

0 个答案:

没有答案