2012-11-17 45 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。

相关问题