【问题标题】:Evaluating a function using numpy使用 numpy 评估函数
【发布时间】:2018-12-08 05:20:59
【问题描述】:

在评估函数时,返回部分的意义是什么?为什么需要这样做?

【问题讨论】:

  • 修正缩进!
  • 抱歉,我很困惑——你的意思是我在某处有不必要的空间吗?
  • 你有一些我修复了,但你真的应该创建一个最小的可行示例来清楚地显示你的问题。而且您的 f1 函数返回分配没有意义。
  • 试试dfdx[x==0]

标签: python arrays numpy


【解决方案1】:

您的假设是正确的:dfdx[0] 确实是该数组中的第一个值,因此根据您的代码,这将对应于评估 x=-1.0 处的导数。

要知道 x 等于 0 的正确索引,您必须在 x 数组中查找它。

找到它的一种方法如下,我们在其中找到 |x-0| 的值的索引使用argmin 是最小的(所以本质上是 x=0 但浮点运算需要采取一些预防措施):

index0 = np.argmin(np.abs(x-0))

然后我们得到我们想要的,dfdx 在 x 为 0 的索引处:

print dfdx[index0]

关于浮点算术技巧的另一种但不太可靠的方法是执行以下操作:

# we make a boolean array that is True where x is zero and False everywhere else
bool_array = (x==0) 
# Numpy alows to use a boolean array as a way to index an array
# Doing so will get you the all the values of dfdx where bool_array is True 
# In our case that will hopefully give us dfdx where x=0
print dfdx[bool_array] 
# same thing as oneliner
print dfdx[x==0]

【讨论】:

    【解决方案2】:

    你给出答案。 x[0]-1.0,并且您想要数组中间的值。`np.linspace 是构建此类值系列的好函数:

    def f1(x):
        g = np.sin(math.pi*np.exp(-x))
        return g
    
    n = 1001 # odd !
    x=linspace(-1,1,n) #x[n//2] is 0
    f1x=f1(x)
    df1=np.diff(f1(x),1)
    dx=np.diff(x)
    
    df1dx = - math.pi*np.exp(-x)*np.cos(math.pi*np.exp(-x))[:-1] # to discard last element
    
    # In [3]: np.allclose(df1/dx,df1dx,atol=dx[0])
    # Out[3]: True
    

    作为另一个技巧,numpy 数组在没有循环的情况下使用起来更加高效和可读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多