【问题标题】:how to store my iterations into arrays in python?如何将我的迭代存储到python中的数组中?
【发布时间】:2017-11-04 11:48:26
【问题描述】:

我定义了以下函数,它以 x 和 n 作为参数,使用泰勒级数求和来近似反正切。我还在其中嵌入了一个条件语句,因此该函数适用于所有 x。 导入数学

import math

for x in range(1,10,1):
   def arctan(x, n):
       arctang=0
       inv_x=1/x
       for i in range(n):
        sign=(-1)**i
        arctang = arctang + ((inv_x**(2.0*i+1))/(2.0*i+1))*sign

       if x>0:
        arc_tan=(math.pi/2)-arctang

       else:
           arc_tan=-(math.pi/2)-arctang

       return arc_tan


   print(arctan(x,100))

此代码打印迭代:

0.7878981009052581

1.1071487177940906

1.2490457723982544

1.3258176636680326

1.3734007669450157

1.4056476493802696

1.4288992721907325

1.446441332248135

1.460139105621001

但是我希望能够将 x 值存储到一个数组中,并将这些迭代存储到另一个数组中,这样我就可以从数组中生成一个图形,即: x=[1,2,3,4,5,6,7,8,9] y=[列出的迭代次数]

我该怎么做呢?

谢谢!

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    只需初始化一个 xmapymap 的空数组,然后在其中尝试append。示例代码如下所示:

    xmap = []
    xmap.append(str(x))
    

    y 也是如此。

    ymap = []
    ymap.append(str(arctan(x,100)))
    

    不要忘记在循环外初始化xmapymap。如果您希望我修改您的整个代码,请告诉我。

    更新 完整的一维数组代码。

    import math
    xmap = []
    ymap = []
    
    for x in range(1,10,1):
       def arctan(x, n):
           arctang=0
           inv_x=1/x
           for i in range(n):
            sign=(-1)**i
            arctang = arctang + ((inv_x**(2.0*i+1))/(2.0*i+1))*sign
    
           if x>0:
            arc_tan=(math.pi/2)-arctang
    
           else:
               arc_tan=-(math.pi/2)-arctang
    
           return arc_tan
       xmap.append(str(x))
       ymap.append(str(arctan(x,100)))
    
    x = xmap
    y = ymap
    print "x= ",x
    print "y= ",y
    

    【讨论】:

    • 感谢您的回复! :) 我试过下面的代码:xmap = [] xmap.append(str(x)) ymap = [] ymap.append(str(arctan(x,100))) print(xmap, ymap),但它只返回一个一维数组....如果没有问题,请您修改我的代码吗?
    • 是的,当然!我可以修改代码。但是你能告诉我你的预期输出是什么吗?因为从你的问题我能理解的是它是一维数组。
    • 感谢prashant,我认为这已经成功了!我只是将数据类型更改为浮动,因为想要输出 x 和 y 的 1d 数组,因此可以将它们相互绘制。
    【解决方案2】:

    不要在每次迭代中重新定义函数。这样您就可以使用列表推导来创建“迭代”列表。

    import math
    
    def arctan(x, n):
           arctang = 0
           inv_x = 1/x
           for i in range(n):
            sign=(-1) ** i
            arctang = arctang + ((inv_x ** (2.0 * i + 1)) / (2.0 * i+1)) * sign
    
           if x>0:
            arc_tan = (math.pi / 2) - arctang
    
           else:
               arc_tan = -(math.pi / 2) - arctang
    
           return arc_tan
    
    iterations = [arctan(x, 100) for x in range(1, 10, 1)]
    

    您可以将推导更改为也存储x 的值,那么iterations 列表的每个元素都将是一个元组:

    iterations = [(x, arctan(x, 100)) for x in range(1, 10, 1)]
    

    顺便说一句,numpy 已经有一个arctan 函数:numpy.arctan

    【讨论】:

      【解决方案3】:

      为什么不对arctan() 本身进行矢量化?

      def varctan(x, n):
          inv_x = 1/x
      
          signs = numpy.empty((len(x), n))
          signs[:, ::2] = 1
          signs[:, 1::2] = -1
      
          exprange = 2.0 * numpy.arange(n)[None, :] + 1
          signs *= (inv_x[:, None] ** exprange) / (exprange)
          arctang = numpy.sum(signs, axis=1)
      
          arctang *= -1
          arctang[x > 0] += numpy.pi / 2
          arctang[~x > 0] -= numpy.pi / 2
      
          return arctang
      
      varctan(numpy.arange(1, 10), 100)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-05
        • 2013-11-17
        • 1970-01-01
        • 1970-01-01
        • 2012-11-20
        • 2016-06-17
        • 2014-12-04
        相关资源
        最近更新 更多