我有一个采用以下形式的函数:

def signal_prototype(t, A, f, p):
    return A*np.sin(2*np.pi*f*t+p)

我想把它矢量化,这样我就可以使用如下函数.

signal_A = SOME_VECTORIZE_FUNCTION(signal_prototype, t=t, A=1, f=10000, p=0)
signal_B = SOME_VECTORIZE_FUNCTION(signal_prototype, t=t, A=1, f=10000, p=np.pi/4)
signal_C = SOME_VECTORIZE_FUNCTION(signal_prototype, t=t, A=1, f=10000, p=np.pi/2)
signal_D = SOME_VECTORIZE_FUNCTION(signal_prototype, t=t, A=1, f=10000, p=3*np.pi/4)

t = np.linspace(0,1e-3,100000)
X1 = signal_A(t)
X2 = signal_B(t)
X3 = signal_C(t)
X4 = signal_D(t)

谢谢!

我试着使用np.vectorize,并阅读了文档.似乎没有任何方法可以将静态参数发送到矢量化.

然而,矢量化可能不是最好的工具.

我有一组复杂的微分方程式,这些信号是它们的输入.所以,我需要形式为f(t,x)的函数.

新的信号函数是随着模型中的条件变化而动态创建的.因此, for each 方程创建一个静态版本不是一个好的 Select .

推荐答案

np.sin()已经矢量化,因为它将在数组上工作

>>> np.sin(np.array([1,2,3]))
array([0.84147098, 0.90929743, 0.14112001])

您可以直接调用您的函数

def signal_prototype(t, A, f, p):
    return A*np.sin(2*np.pi*f*t+p)

t = np.linspace(0,1e-3,100000)

X1 = signal_prototype(t=t, A=1, f=10000, p=0)
X2 = signal_prototype(t=t, A=1, f=10000, p=np.pi/4)
X3 = signal_prototype(t=t, A=1, f=10000, p=np.pi/2)
X4 = signal_prototype(t=t, A=1, f=10000, p=3*np.pi/4)

如果要 for each 函数创建一个单独的函数,可以按照建议使用lambdafunctools.partial

signal_A = lambda t: signal_prototype(t=t, A=1, f=10000, p=0)
signal_B = lambda t: signal_prototype(t=t, A=1, f=10000, p=np.pi/4)
signal_C = lambda t: signal_prototype(t=t, A=1, f=10000, p=np.pi/2)
signal_D = lambda t: signal_prototype(t=t, A=1, f=10000, p=3*np.pi/4)

X1 = signal_A(t)
X2 = signal_B(t)
X3 = signal_C(t)
X4 = signal_D(t)

或者自己返回分部函数(实际上与lambda相同)

def wrapper(func, **kwargs):
    def wrapped(t):
        return func(t, **kwargs)            
    return wrapped

signal_A = wrapper(signal_prototype, A=1, f=10000, p=0)
signal_B = wrapper(signal_prototype, A=1, f=10000, p=np.pi/4)
signal_C = wrapper(signal_prototype, A=1, f=10000, p=np.pi/2)
signal_D = wrapper(signal_prototype, A=1, f=10000, p=3*np.pi/4)

如果您想要传递默认的t或使其成为可选的,您可以扩展它,尽管我不建议这样做,只是让它来说明它有多强大,因为返回不同类型的东西从来都不是明智之举(如带有可变数量参数的IMO函数)

do not do this

def wrapper(func, t=None, **kwargs):
    if t is not None:
        def wrapped(t=t):
            return func(t, **kwargs)
    else:
        def wrapped(t):
            return func(t, **kwargs)
    return wrapped
>>> wrapper(signal_prototype, A=1, f=10000, p=0)(t)
array([ 0.00000000e+00,  6.28324773e-04,  1.25664930e-03, ...,
       -1.25664930e-03, -6.28324773e-04, -2.44929360e-15])
>>> wrapper(signal_prototype, t=t, A=1, f=10000, p=0)()
array([ 0.00000000e+00,  6.28324773e-04,  1.25664930e-03, ...,
       -1.25664930e-03, -6.28324773e-04, -2.44929360e-15])

Python相关问答推荐

使用子字符串动态更新Python DataFrame中的列

日程优化问题不知道更好的方式来呈现解决方案- Python / Gekko

单击cookie按钮,但结果不一致

我可以使用极点优化这个面向cpu的pandas代码吗?

Flask主机持续 bootstrap 本地IP| Python

如何将我的位置与光强度数据匹配到折射图案曲线中?

查找下一个值=实际值加上使用极点的50%

如何处理嵌套的SON?

GL pygame无法让缓冲区与vertextPointer和colorPointer一起可靠地工作

滚动和,句号来自Pandas列

加速Python循环

两个pandas的平均值按元素的结果串接元素.为什么?

梯度下降:简化要素集的运行时间比原始要素集长

如何在Polars中从列表中的所有 struct 中 Select 字段?

在含噪声的3D点网格中识别4连通点模式

driver. find_element无法通过class_name找到元素'""

连接一个rabrame和另一个1d rabrame不是问题,但当使用[...]'运算符会产生不同的结果

如何启动下载并在不击中磁盘的情况下呈现响应?

将scipy. sparse矩阵直接保存为常规txt文件

使用BeautifulSoup抓取所有链接