我一直在寻找一种方法来处理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稍微多了一些,因为要做的事情很简单。 到目前为止,每个人都工作正常,但我有很多微小的具体问题(并且可能会在发布时发布更多):
我想在涉及大量矢量方程和函数的项目中使用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秒