【问题标题】:Difficulty with numpy.append(). It works when I type it myself into IDLE but not when runnumpy.append() 的困难。它在我自己输入 IDLE 时有效,但在运行时无效
【发布时间】:2013-12-09 06:24:15
【问题描述】:

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

    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 的数组;但是当我运行模块时,它只返回输入。

所有证据似乎都指向我错误地使用了 append,但就像我所说的,我在 shell 中键入它并运行良好。

真的很郁闷,任何cmets都将不胜感激。

【问题讨论】:

  • 2 建议:给我们一个只有附加的例子,没有 f_prime 的东西。并演示您如何调用该函数。正如答案所暗示的,你如何使用这个函数可能比它的内部更重要。

标签: python arrays numpy append


【解决方案1】:

在这种情况下,Append 返回一个新数组。它不会改变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 数组,您最终会在循环的每次迭代中分配大量内存。

【讨论】:

  • 明确一点:当np.append(a, 1) 在末尾显示一个带有1 的数组时,这看起来像是在第一行之后“起作用”,但解释器只是打印输出,并且正如@MrE 所示,必须保存输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多