【问题标题】:Apply a function to each element of an array in Python在 Python 中将函数应用于数组的每个元素
【发布时间】:2022-01-21 04:37:48
【问题描述】:

我正在尝试在 Python 中做两件事:

  1. 从泊松分布中模拟 100 次随机抽取。我是这样做的:
sample100 = poisson.rvs(mu=5,size=100)
  1. 获取上述样本,并将我生成的 UMP 检验应用于每个单独的观察结果(例如,针对每个单独的观察结果检验假设)。如果观察值 8 则拒绝

我不知道如何做第二部分。我做的功能代码是:

    def optionaltest(y,k,g):
    
        if (y > k):
            return 1
        if (y == k):
            if rand(uniform(0,1)) >= 0.4885: return 1
            else: return 0
        if (y < k):
            return 0

但是有两个问题 - 显然 if (y==k) 是无效的语法。其次,即使我删除了该部分,我实际上也无法将该函数应用于 sample100,因为它是一个数组。

如何修改它以使其正常工作?显然,我对 Python 很陌生,但我已经在互联网上搜索了好几个小时。也许我应该更改生成示例数据的方式,以便可以对其应用函数?也许有一种方法可以将函数应用于数组的每个元素?当输出 = k(在这种情况下我将设置为 8)时,如何使测试逻辑工作?

编辑/更新: 以下是我最终的做法:

    def optionaltest(y):
    
        if (y > 8):
            return 1
        if (y == 8):
            if np.random.uniform(0,1) >= 0.4885: return 1
            else: return 0
        if (y < 8):
            return 0

我能够通过以下方式将该测试应用于我的数组数据:

results_sample100 = list(map(optimaltest, sample100))
cl.Counter(results_sample100)

【问题讨论】:

  • 您能否更新您的问题以包含“无效语法”错误或堆栈跟踪?至于第二部分,您需要对这些结果做什么?您可以创建一个空的results = [] 列表并循环遍历您的数据以将函数应用于每个项目并将其返回值附加到您的results 列表中吗?您可以使用for 循环、map 函数或列表推导。我更喜欢最后一个,因为它比map 更清晰
  • 您可以将数组转换为列表并使用map

标签: python poisson


【解决方案1】:

这是无效的python语法

if rand(uniform(0,1)) >= 0.4885 then 1
    else 0

相反,您可以这样做:

return 1 if rand(uniform(0,1)) >= 0.4885 else 0

你也可以做一些更冗长但可能更直接的事情(这通常是一个品味问题),像这样:

def optionaltest(y,k,g):

    if (y > k):
        return 1
    if (y == k):
        if rand(uniform(0,1)) >= 0.4885:
            return 1
        else:
            return 0
    if (y < k):
        return 0

甚至像这样:

def optionaltest(y,k,g):

    if (y > k):
        return 1
    if (y == k) and rand(uniform(0,1)) >= 0.4885:
        return 1
    else:
        return 0

对于这个问题:

也许有一种方法可以将函数应用于数组的每个元素?

您可以在列表上使用 for 循环或 map 函数:

results = []
for elem in somelist:
     results.append(my_function(elem))

交替:

results = list(map(my_function, somelist))

不过,您的函数需要三个参数,我不清楚这些参数的来源。您的列表是元组列表吗?

【讨论】:

  • 非常感谢,这真的很有帮助。我已将我的函数更改为:def optionaltest(y): if (y &gt; 8): return 1 if (y == k): if rand(uniform(0,1)) &gt;= 0.4885: return 1 else: return 0 if (y &lt; 8): return 0 我希望我可以根据逻辑测试数组中的每个元素 - 所以在这种情况下,y 将是数组中的一个元素
  • 啊,那样的话,你可以轻松使用map方法。
  • 我最终根据您的反馈解决了这个问题 - 非常感谢!
  • 当然。不客气。
【解决方案2】:

语法错误是

在 Python 中如果条件 then..else 变为

if condition:
       pass
else:
       pass

【讨论】:

    【解决方案3】:

    要在列表元素上应用函数,您可以将列表转换为 pandas 数据框。然后使用应用功能。例如,如果您的列表名称是“data”并且您的函数是“func”,请执行以下操作:

    import pandas as pd
    data = ['item_1', 'item_2', 'item_3']
    df = pd.DataFrame (data, columns = ['column_name'])
    
    result = df.apply(func)
    

    【讨论】:

      猜你喜欢
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 2015-09-09
      • 2021-05-25
      • 2013-10-13
      • 2012-01-24
      • 2017-05-01
      相关资源
      最近更新 更多