参数多态性问题:使用具有单个浮点参数的函数和一个浮点参数数组

Parametric Polymorphism Problem: Using function with single float parameter with an array of float parameters

为了阐明我的意思,我的问题是模拟退火问题,我想在其中找到给我形状最大面积的 theta:

def Area(theta):
    #returns area
def SimAnneal(space,func, T):
    #space is some linspace
    #func is some function that takes in some theta and outputs some area
    #T = separate temperature parameter that is not relevant for problem
    #returns maximum area from given thetas

在这种情况下,模拟退火通过选择随机起始“theta”开始。我的目标是使用上面的设置,如下所示。应该注意的是,area() 的输入是单个 theta,但我希望有某种方法可以使 ?下一个函数 SimAnneal() 可以从中选择的“潜在”thetas 列表。

  x = np.linspace(0,100,1000)
  func = area(?)
  T = 4
  SimAnneal(x,func,T)

我应该输入什么?为了让SimAnneal正确输出。

换句话说,有没有?可以满足作为单个 float 参数的条件,但在某些 linspace?

中携带所有可能的 float 参数

首先,不存在既是float又是集合的数据类型。此外,您希望将 area 函数直接传递给 SimAnneal 函数,而不是像您当前拥有的那样调用它的 return:

SimAnneal(x, area, T)

从设计的角度来看,将 area 函数保留为将单个浮点数作为参数会更有意义。话虽这么说,通过列表 运行 单个函数并将这些输出与使用称为 Dictionary Comprehensions 的技术创建它的 theta 一起存储是相对简单的。在下面的示例中,thetas 是您要从中选择的 thetas 列表:

areas = {i: area(i) for i in thetas}

然后您可以从那里搜索新词典以找到产生最大面积的 theta:

max_theta = list(areas.keys())[0] # retrieve the first theta

for theta, area in areas.items():
    if area > areas[theta]:
        max_theta = theta

return theta

您可以使用 np.vectorize 来应用 func 取单个值,如下所示:

import numpy as np

def Area(theta):
    pass

def SimAnneal(space, func, T):
    applied_space = np.vectorize(func)(space)

x = np.linspace(0, 100, 1000)
T = 4
SimAnneal(x, Area, T)

请注意,np.vectorize 实际上不会给您带来我们在实际矢量化中看到的性能改进。相反,它是一个方便的界面,完全符合您的需要:将一个接受单个值的 func 应用到一堆值(您的 space)。

或者,您可以将 np.vectorize 调用移动到 SimAnneal 之外,如下所示:

def SimAnneal(space, func, T):
    applied_space = func(space)

x = np.linspace(0, 100, 1000)
func = np.vectorize(Area)
T = 4
SimAnneal(x, func, T)

这更接近您的原始示例。