将函数应用于 Python 中数组的每个元素

Apply a function to each element of an array in Python

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

  1. 根据泊松分布模拟 100 次随机抽取。我通过以下方式完成了此操作:
sample100 = poisson.rvs(mu=5,size=100)
  1. 采用上述示例,并将我生成的 UMP 测试应用于每个单独的观察(例如,针对每个单独的观察来检验假设)。如果观察值 < 8,则检验应接受原假设;如果观察值 = 8,则以 ~50% 的概率拒绝;如果观察值 > 8
  2. ,则拒绝

我不知道该怎么做第二部分。我做的函数代码是:

    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)时,如何使测试逻辑工作?

EDIT/UPDATE: 以下是我最终的做法:

    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)

语法错误是

in Python if condition then..else 变为

if condition:
       pass
else:
       pass

这是无效的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

对于这个问题:

Maybe there's a way to apply a function to each element of an array?

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

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

或者:

results = list(map(my_function, somelist))

虽然你的函数有三个参数,但我不清楚它们来自哪里。您的列表是元组列表吗?

要在列表元素上应用函数,您可以将列表转换为 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)