0

事情的後續問題my last one有關編寫高效的Python程序。我一直在玩自己寫的物理模擬,並希望擺脫使用十億個類和方法。將計算結果寫回到它的數組中?

所以我希望能夠對數據集進行計算。這是我最新的嘗試:

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的的矢量化功能,itertools,地圖(),等...但我怎麼會去把結果返回到原來的陣列?

或正在使用中間陣列覆蓋去原來的唯一途徑之前將結果儲存?

+1

moveParticles如何被調用? – Sinkingpoint 2013-03-18 07:51:15

+0

請提供要求的輸出。 – root 2013-03-18 07:52:14

+1

因爲你在你的數據,不同長度的名單什麼'np.array'回報是D型'object'和'粒子[:,0]','粒子[:, 1]'和'粒子[:, 2]'是Python列表,而不是數組。因此,當您嘗試將速度列表與「dt」浮點數相乘時會出現錯誤。你應該嘗試在數組中存儲同類數據。我喜歡下面的Balint's sanswer! – Jaime 2013-03-18 14:06:09

回答

2

我想,你只是調用你的日常錯誤的方式(也許傳遞整個粒子陣列而非陣列的只有一個粒子。

無論如何,對其他可能的解決辦法是在各分割你的數組數組:

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 

這將使就地更換poslastpos爲了移動你的粒子,你就必須要調用的函數爲:

moveParticles(pos, lastpos, velocity, 1) 

在哪裏設置DT = 1。我還假設,你想擁有浮點座標,如果沒有,你應該產生整數數組來代替。

+0

這看起來像一個非常好的解決方案。這意味着如果我銷燬一個粒子,而不是僅僅刪除一個元素,我將不得不從多個數組中刪除相同的元素。謝謝! – mooglinux 2013-03-18 14:56:06