0

効率的な Python プログラムの作成に関する前回の質問の補足質問です。私は自分自身の物理シミュレーションを書いて遊んでいて、10 億のクラスとメソッドを使用することから離れたいと思っています。

そのため、一連のデータに対して計算を実行できるようにしたいと考えています。これは私の最新の試みです:

particles = np.array([ #position, last position, velocity, mass, size
                 [[200,0],[200,200],[5,5],10,15], \
                 [[210,210],[210,210],[8,2],20,25],\
                 [[215,215],[195,195],[5,3],5,15], \
                 [[192,186],[160,160],[10,-4],30,30]])

def moveParticles(part, dt):
    part[0] = part[1]
    part[1] += np.multiply(part[2],dt)

各パーティクルの各プロパティを配列に格納し、その場で更新しようとしています。ここでは、速度ベクトルにタイム ステップを掛けて、それを位置ベクトルに加算しようとしています。これは私にはこれを表現する自然な方法のように思えますが、エラーが発生します:

TypeError: can't multiply sequence by non-int of type 'float'

データを同じ配列に書き戻すことはできますか? また、どのように行うのですか?

私は読んでいて、numpy の vectorize 関数、itertools、map() などを見てきましたが、結果を元の配列に戻すにはどうすればよいでしょうか?

それとも、元の配列を上書きする前に中間配列を使用して結果を保存するのが唯一の方法ですか?

4

1 に答える 1

2

ルーチンを間違った方法で呼び出しているだけだと思います (おそらく、1 つの粒子のみの配列ではなく、粒子配列全体を渡します。

とにかく、他の可能な解決策は、配列を個々の配列に分割することです。

import numpy as np
pos = np.array([[200,0], [210,210], [215,215], [192,186]], dtype=float)
lastpos = np.array([[200,2000], [ 210,210], [195, 195], [160,160]], dtype=float)
velocity = np.array([[ 5,5], [8,2], [5,3], [10,-4]], dtype=float)
mass = np.array([ 10, 20, 5, 30 ], dtype=float)
size = np.array([ 15, 25, 15, 30 ], dtype=float)

def moveParticles(pos, lastpos, velocity, dt):
    lastpos[:] = pos[:]
    pos[:] += velocity * dt

これにより、 と のインプレース置換が行われposますlastpos。パーティクルを移動するには、関数を次のように呼び出す必要があります。

moveParticles(pos, lastpos, velocity, 1)

ここで dt = 1 を設定します。また、浮動小数点座標が必要であると仮定しました。そうでない場合は、代わりに整数配列を生成する必要があります。

于 2013-03-18T08:13:47.920 に答える