将numpy数组值设置得更精确

时间:2017-12-09 14:37:58

标签: python numpy

我有一个数组有值,如果精确计算:[3.056565 3.924560]但是在python中它打印圆形数字,数组是[3.06,3.93]。该数组用于计算其他内容,结果与预期不同。如何使该数组停止舍入?

以下是您可以看到数组未精确计算的代码:

import datetime
import math
import numpy as np

def numGradient(f, x, h):


  n = len(x)
  g = [0]*n
  g = np.array(g)

  for i in range(n):
    e = [0]*n
    e[i] = 1
    e=np.array(e)


    g[i] = (f(x+e*h)-f(x-e*h))//(2*h)

  return(g)

def myFun(x) :
    return ( 0.6 + ((math.sin(x[0]**2-x[1]**2))**2-0.5)/((1+0.001*(x[0]**2+x[1]**2))**2) )
x_old=(3,4)

xthis = x_old - 0.01*numGradient(myFun, x_old, 10**(-6))

print(xthis)

1 个答案:

答案 0 :(得分:3)

您的代码存在一些问题。它可能无法计算您期望计算的内容。

首先,这是初始化NumPy数组的错误方法

  g = [0]*n
  g = np.array(g)

将其替换为

  g = np.zeros(n)

其次,对e执行相同操作。

for i in range(n):
    e = np.zeros(n)
    e[i] = 1

最重要的是取代

g[i] = (f(x+e*h)-f(x-e*h))//(2*h)

g[i] = (f(x+e*h)-f(x-e*h))/(2*h)

毕竟这是浮点除法。 //是Python 3中所谓的整数除法。

更改后,您将获得

[ 3.056565  3.92456 ]

这可能是你应该得到的。

以下是更改后的完整代码:

import datetime
import math
import numpy as np

def numGradient(f, x, h):


  n = len(x)
  g = np.zeros(n)

  for i in range(n):
    e = np.zeros(n)
    e[i] = 1
    g[i] = (f(x+e*h)-f(x-e*h))/(2*h)

  return(g)

def myFun(x) :
    return ( 0.6 + 
       ((math.sin(x[0]**2-x[1]**2))**2-0.5)/((1+0.001*(x[0]**2+x[1]**2))**2) )


x_old=(3,4)

np.set_printoptions(precision=6)

xthis = x_old - 0.01*numGradient(myFun, x_old, 10**(-6))

print(xthis)