【问题标题】:How to have a function repeat itself multiple times?如何让一个功能重复多次?
【发布时间】:2021-11-22 22:56:21
【问题描述】:

所以我想生成 ???? 0 到 1 之间的随机浮点数并计算平均值。然后重复这个????次。我想稍后用它做一个直方图。

这是我目前想出的:

import numpy as np
import matplotlib.pyplot as plt
import random

#random float number between 0 and 1
x=np.random.random(n)

print(np.mean(x))

#building my function
def myFunction(n,m):
    for n in x:
        return(np.mean(x))

print(myFunction(5,10))

所以当然这只会给我一个平均值,我的问题是如何构建我的函数来重复自己????次?

【问题讨论】:

  • 多次计算平均值有什么意义?您每次都传递相同的参数,因此您将获得相同的结果。无论如何,一旦您执行return,该功能就完成 - 不会再发生循环迭代。
  • 我每次都会得到 n 个随机数,所以每次我都需要计算一个新的平均值
  • 一个函数只能返回一次。
  • 这就是循环的用途。
  • 但是每次循环都不会得到不同的随机数。它每次都处理相同的随机数。

标签: python python-3.x numpy


【解决方案1】:

你不需要任何循环。

与其生成n 元素m 的随机数组,不如创建一个n x m 数组并使用numpy 的API 沿第二个轴取平均值:

import numpy
m = 10
n = 5

x = numpy.random.random(size=(n, m))
means = x.mean(axis=1)

【讨论】:

  • 我认为大小应该是(m, n)
  • @KellyBundy 它可以是任何一个,你只需要选择正确的轴来计算平均值
【解决方案2】:

你的尝试有点不对劲。您将n 传递给函数,但您也可以执行for n in x。所以 n 被覆盖,但 x 也是一个数字,所以它不会迭代你想要的方式。 for 循环可以嵌套,因此您可以初始化两个列表,一个将是 m 中每次运行的平均值,另一个将在 m 中存储每次运行中的所有值以返回平均值。

def myFunction(n,m):
    mean_list = []

    for _ in range(m):
        inner_list = []

        for i in range(n):
            inner_list.append(np.random.random())

        mean_list.append(np.mean(inner_list))

    return mean_list

这会返回一个手段列表,m 是准确的意思。所以

myFunction(5, 10)

返回(例如)

[0.6635917645438433, 0.5569813806972684, 0.5869406453209447, 0.48729391271790945, 0.6276934115328581, 0.6109176360963581, 0.45357579860009095, 0.611056289890255, 0.15579494695767637, 0.5097066251736436]

【讨论】:

    【解决方案3】:

    请看下面代码中的cmets进行解释:

    import numpy as np
    
    import matplotlib.pyplot as plt
    
    import random
    
    #Your function should contain a loop:
    def myFunction(n,m):
      # This loop is the "repeat M times" part. The variable "i"
      # will count 0 to M - 1, a total of "M" iterations
      for i in range(m):   
        #Everything inside here will run "M" times 
        x = np.random.random(n) # Here we generate N random numbers
        mean = np.mean(x) #Here is the mean
        
        #Print the means
        print("Iteration {} mean: {}".format(i, mean))
    
    myFunction(5,10) #Call it with N = 5 and M = 10
    

    【讨论】:

      【解决方案4】:

      您的代码不起作用,因为return 结束了函数,您必须返回某种类型的列表或数据容器 (1)。另一种选择是使用您想要的参数运行外部循环 (2)。

      例如。 1

      def mf(m, n):
          return np.mean(n)
      
      data = []
      
      for x in range(m):
          data.append([x, mf(m, n)])
      

      2

      def mf(m, n):
          data = []
          for x in range(m):
              data.append([x, np.mean(n)])
          return data
      
      

      【讨论】:

        【解决方案5】:

        您的代码存在一些问题。

        首先,由于您在函数外部创建了 x,因此它只创建了 n 个随机值并重复使用相同的 x 值,从而得到相同的均值。

        其次,当你在for循环中使用return时,它将停止for循环并在第一次迭代中退出函数,导致只有一个输出。

        更好的方法

        import numpy as np # numpy has random module
        import matplotlib.pyplot as plt
        
        def myFunction(n,m):
            list = []
            for i in range(m):
                x = np.random.rand(n)
                list.append(np.mean(x))
            return np.array(list)
        
        # Even better way is to use list comprehension
        def myFunction(n,m):
            list = np.array([np.mean(np.random.rand(n)) for i in range(m)])
            return list
        
        

        【讨论】:

          【解决方案6】:

          你需要在循环中创建随机数组,所以每次得到的随机数都不一样。

          循环应该将所有结果收集到一个列表中,并返回该列表。您可以使用列表推导来做到这一点。

          def myFunction(n,m):
              return [np.mean(np.random(n)) for _ in range(m)]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-09-22
            相关资源
            最近更新 更多