【问题标题】:How to transform a np.array into a function?如何将 np.array 转换为函数?
【发布时间】:2021-04-30 01:18:25
【问题描述】:

我有以下np.array,它描述了一个矩形波。我想将它转换为可调用函数,并带有一个连续的参数。 np.array 是:

import matplotlib.pyplot as plt
import numpy as np
from numpy.random import seed
from numpy.random import rand


def piecewise_control( off_times,amp_inj, period_inj ):

   def select(T):
       
       return lambda t: (-T/2 <= t) & (t < T/2)

   def pulse_train(t, at, shape):
       
       return np.sum(shape(t - at[:,np.newaxis]), axis=0)



   for i in range(1,len(off_times)):

     off_times[i] += off_times[i-1]  + period_inj

 
  
   return  amp_inj*pulse_train(t,off_times,shape=select(period_inj))               


t=np.linspace(0,100,10000)
off_times = 10*rand(10)
period_inj = 1
amp_inj = 1 

control = piecewise_control(  off_times,amp_inj, period_inj )

plt.plot(t,control)
plt.show()

这个answer 启发了我。

剧情如下:

问题是:我们能否将数组control转换为一个具有连续参数的函数?

当然,如果我们这样做了:

def ccontrol(t, control):
      return control[t]

不幸的是,我们会得到一个只依赖于整数的函数。

【问题讨论】:

  • 你指的是哪个浮动变量?
  • @Tarik 抱歉,我删除了这个词,因为它具有误导性。我想要像 sint(t) 这样的函数一样可调用的东西。
  • 你想把哪个数组转成函数?能否提供函数签名(参数)和预期回报?
  • @Tarik 数组是control,它是通过函数piecewise_control 定义的。我想将此数组作为为每个参数定义的可调用函数。我认为插值技术或密集输出将是一个关键点。

标签: python function numpy interpolation transformation


【解决方案1】:

您可以subclass numpy.ndarray 并实现__call__ 方法:

import numpy as np

class MyArray(np.ndarray):
    def __call__(self, idx):
        return self[idx]

control = np.random.rand(100)
control_view = control.view(MyArray)

print(control_view(5), control[5])

对于插值,您可以使用scipy.interpolate。事实上,插值例程can return functions 可以使用任何输入调用,不一定是整数。

【讨论】:

  • 您的解决方案提供了与我的ccontrol 函数相同的输出。
  • @Siderius,对,但它是一个可调用数组,而不是一个单独的函数。既然您编辑了需要使用浮点数调用此函数的问题,scipy.interpolate 正是这样做的。
猜你喜欢
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
相关资源
最近更新 更多