numpy.append()的难度。当我自己输入IDLE而不是在运行时它可以工作

时间:2013-11-24 17:35:17

标签: python arrays numpy append

我很欣赏这对其他任何人来说都不是一个非常普遍或适用的问题,但它让我感到难过,并且可能比我想的更多地教给我。

    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中输入它只是相同而且运行正常。

这真的很令人沮丧,任何评论都会非常感激。

1 个答案:

答案 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_xpoint_history_y的普通Python列表。使用NumPy数组,您最终会在循环的每次迭代中分配大量内存。