1

我一直在寻找一种在 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

还有一点,省略以保持简短。到目前为止一切正常,但我有很多小的具体问题(并且可能会在他们出现时发布更多):

  1. 是否有数字和序列类型的基类,我该如何解决它们?
  2. 我怎样才能让所有这些更 Python-y?我想学习如何编写好的 Python 代码,所以如果你发现一些效率低下或丑陋的东西,请告诉我。
  3. 精度呢?由于 python 似乎仅在必要时才从整数转换为浮点数,因此输入和输出通常是相同的类型。因此,非常大或小的数字可能存在问题,但我目前并不真正需要这些。我通常应该担心精度还是 python 为我做这件事?自动转换为最大可能的类型会更好吗?那是哪一个?除此之外会发生什么?

我想在涉及大量向量方程和函数的项目中使用 n 维向量,并且我希望能够使用数学教科书中使用的常用符号。正如您所看到的,它继承自元组(为了便于构造、不变性和索引),并且大多数内置函数都被覆盖,以便使用 (+,-,*,..)- 运算符。它们仅在左操作数是 vec 时才有效(我可以更改它吗?)。乘法包括点积和标量积,如果两个向量都是 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()')

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

cProfile.run('testVec()')

-> 100009 次函数调用在 0.064 秒内

4

0 回答 0