我很欣赏这对其他任何人来说都不是一个非常普遍或适用的问题,但它让我感到难过,并且可能比我想的更多地教给我。
def gradient_descent((x,y)):
x = (x,y)[0]
y = (x,y)[1]
point_history_x[0] = x
point_history_y[0] = y #set initial states
while numpy.linalg.norm(f_prime((x,y))) >= 0.1: #modulus of gradient
x = x - gamma*f_prime((x,y))[0]
y = y - gamma*f_prime((x,y))[1] #find next point
numpy.append(point_history_x,x)
numpy.append(point_history_y,y) #add to history of point movement
return point_history_x, point_history_y
之前,point_history_x(和y)全局定义为numpy.zeros((1))。 当运行点(0,0)时,它为两个历史数组返回0。当我将自己的每个级别输入到python shell中时,它工作正常并创建变量x的数组;但是当我运行模块时,它只返回输入。
所有证据似乎都指向我使用不正确的追加,但就像我说的那样,我在shell中输入它只是相同而且运行正常。
这真的很令人沮丧,任何评论都会非常感激。
答案 0 :(得分:1)
在这种情况下追加返回一个新数组。它不会改变point_history_x
。
>>> import numpy as np
>>> a = np.array([2.0])
>>> np.append(a, 1)
array([ 2., 1.])
>>> a
array([ 2.])
>>> a = np.append(a, 1)
>>> a
array([ 2., 1.])
>>>
我们看到np.append
有效 - 没有例外或任何事情 - 但调用不会修改a
,它只会返回一个新数组。第二次拨打np.append
时,我会将结果分配给a
。
在代码的其他部分还有一些非常规/冗余的东西。元组参数解包并不理想,因为它已经removed in Python 3(认为2to3会自动为你转换),但主要原因是它只是让事情变得更加复杂。你可以改变
def gradient_descent((x,y)):
x = (x,y)[0]
y = (x,y)[1]
到
def gradient_descent(pt):
x, y = pt
或
def gradient_descent(x,y):
并使用gradient_descent(*pt)
调用代码。
我认为你最好使用point_history_x
和point_history_y
的普通Python列表。使用NumPy数组,您最终会在循环的每次迭代中分配大量内存。