2012-11-17 87 views
3

我有一個叫做get_gradient的簡單函數,它接受一個[[x,y,Vx,Vy]]的numpy數組並返回[[Vx,Vy,Ax,Ay]]的數組。我想將我的k [0] [0:2]更新爲等於狀態[0] [2:4],但是當我將它們打印出來時,k永遠不會更改值。我創建了一個初始數組的副本,希望它能整理出來,但它仍然不起作用!任何幫助,將不勝感激爲什麼python 2.6不能更新我的numpy數組?

Y   = numpy.array([[0, 0, 0, 0]]) # [x,y,Vx,Vy] 
k   = numpy.array([[0, 0, 0, 0]]) # [x,y,Vx,Vy] 

def get_gradient(Y): 
    state = Y.copy() 
    spring_force = spring.force(state[0], feet_pos[0]) 
    brownian_force = mass.brownian(dt) 
    drag_force  = mass.drag(state[0][2:4]) 
    total_force = spring_force + brownian_force + drag_force  #2d array [Fx,Fy] 

    k[0][0:2] = state[0][2:4]   ##### DOESN'T WORK!!! 
    k[0][2:4] = total_force/mass.mass ##### but this works :s 

    print k[0][0:2] 
    print state[0][2:4] 

    return k 
+1

'k'從哪裏來?你會得到什麼錯誤? – Keith

+0

k是一個numpy數組[[0,0,0,0]],我沒有收到錯誤,代碼運行良好。然而k [0] [0:2]永遠不會從0,0變化。當我打印k [0] [0:2]和狀態[0] [2:4]肯定它們應該是相同的? – user1696811

+0

你能提供一個可運行的例子嗎?我無法重現該問題。 (對我來說,'k [0] [0:2]'和'state [0] [2:4]'是一樣的。) – unutbu

回答

4

這並不是說K不改變,那就是它有一個整數D型,所以當你嘗試指派浮到它,你可能不會得到你所期望的:

>>> k 
array([[ 0, 0, 4863, 1464]]) 
>>> k.dtype 
dtype('int64') 
>>> k[0][0] = 10 
>>> k 
array([[ 10, 0, 4863, 1464]]) 
>>> k[0][0] = 1e-3 
>>> k 
array([[ 0, 0, 4863, 1464]]) 

>>> k 
array([[  0,    0, 4863, 1464]]) 
>>> k[0][0] = 10.2 
>>> k 
array([[  10,    0, 4863, 1464]]) 

但:

>>> f = k.astype(float) 
>>> f 
array([[ 0.,  0., 4863., 1464.]]) 
>>> f[0][0] = 1e-3 
>>> f 
array([[ 1.00000000e-03, 0.00000000e+00, 4.86300000e+03, 
      1.46400000e+03]]) 

注意零後的.

我可能會使用

>>> k = numpy.zeros((1,4)) 
>>> k 
array([[ 0., 0., 0., 0.]]) 

代替;它默認爲float dtype。

相關問題