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
内容を短くするために省略して、もう少しあります。これまでのところ、すべて正常に動作していますが、特定の小さな質問がたくさんあります (そして、それらが出てきたら、おそらくもっと投稿するでしょう):
- 数値型とシーケンス型の基本クラスはありますか?どうすればそれらに対処できますか?
- このすべてをより Python らしくするにはどうすればよいでしょうか? 良い Python コードの書き方を学びたいので、効率の悪いものや醜いものを見つけたら教えてください。
- 精度はどうですか?Pythonは必要な場合にのみ整数から浮動小数点数にキャストするように見えるため、入力と出力は通常同じタイプです。そのため、非常に大きな数または小さな数で問題が発生する可能性がありますが、現在それらは必要ありません。一般的に精度について心配する必要がありますか、それともpythonが私のためにそれを行いますか? 可能な限り最大の型に自動的に変換した方がよいでしょうか? あれはどっち?それを超えるとどうなりますか?
多くのベクトル方程式と関数を含むプロジェクトで 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()')
-> 0.064 秒で 100009 回の関数呼び出し