将函数应用于 Python 中数组的每个元素
Apply a function to each element of an array in Python
我正在尝试在 Python 中做两件事:
- 根据泊松分布模拟 100 次随机抽取。我通过以下方式完成了此操作:
sample100 = poisson.rvs(mu=5,size=100)
- 采用上述示例,并将我生成的 UMP 测试应用于每个单独的观察(例如,针对每个单独的观察来检验假设)。如果观察值 < 8,则检验应接受原假设;如果观察值 = 8,则以 ~50% 的概率拒绝;如果观察值 > 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)时,如何使测试逻辑工作?
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)
我正在尝试在 Python 中做两件事:
- 根据泊松分布模拟 100 次随机抽取。我通过以下方式完成了此操作:
sample100 = poisson.rvs(mu=5,size=100)
- 采用上述示例,并将我生成的 UMP 测试应用于每个单独的观察(例如,针对每个单独的观察来检验假设)。如果观察值 < 8,则检验应接受原假设;如果观察值 = 8,则以 ~50% 的概率拒绝;如果观察值 > 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)时,如何使测试逻辑工作?
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)