封装函数的包装器
Wrapper for an encapsulated function
假设 self.sigma 是一个浮点数,我定义了一个函数 returns 一个函数 a.
def f(self):
a = lambda i: self.sigma*i**2
return a
现在我想扩展 a 的功能,只要 self.sigma 是矩阵:
self.sigma = sigma[i,j]
其中 sigma 是一个二维 numpy 数组。
是否可以定义一个包装器来做到这一点?
我想要这样的东西:
def f(self):
a = lambda i,j: self.sigma[i,j]*i**2
return a
没有明确地重写它。这是最好的方法吗?
附加信息:
在我的程序 f returns 中有五个函数而不是一个。在程序的上下文中,将所有这些函数封装在一个函数 f.
中是有意义的
如果您的 sigma
是一个 numpy 数组,您的 f
将按预期工作:
import numpy as np
def f(sigma):
a = lambda i: sigma*i**2
return a
sigma = np.random.rand(2, 4)
print(sigma)
print(f(sigma)(2))
# [[0.40567906 0.86706289 0.37468664 0.45059327]
# [0.57024244 0.17452584 0.05394594 0.03218902]]
# [[1.62271624 3.46825154 1.49874657 1.80237307]
# [2.28096976 0.69810334 0.21578375 0.12875607]]
如果您的 sigma
是列表的列表,那么您可以使用 numpy 中的 vectorize 并获取函数数组:
sigma = [[1, 2], [3, 4]]
vfunc = np.vectorize(f)
print(vfunc(sigma))
#[[<function f.<locals>.<lambda> at 0x000002DC116DE7B8>
# <function f.<locals>.<lambda> at 0x000002DC116DEC80>]
#
# [<function f.<locals>.<lambda> at 0x000002DC116DEBF8>
# <function f.<locals>.<lambda> at 0x000002DC116DE730>]]
也许 np.vectorize 会做类似的事情?
矢量化 f 将 return 一个 lambda 矩阵。每个都以 i 作为输入。
import numpy as np
def f(sigma):
a = lambda i: sigma*i**2
return a
f_vectorized = np.vectorize(f)
sigma = [[0, 1], [2, 3], [4, 5]]
for i in [0, 1, 2]:
for j in [0, 1]:
print(f_vectorized(sigma)[i, j](i))
# prints 0, 0, 2, 3, 16, 20
假设 self.sigma 是一个浮点数,我定义了一个函数 returns 一个函数 a.
def f(self):
a = lambda i: self.sigma*i**2
return a
现在我想扩展 a 的功能,只要 self.sigma 是矩阵:
self.sigma = sigma[i,j]
其中 sigma 是一个二维 numpy 数组。
是否可以定义一个包装器来做到这一点? 我想要这样的东西:
def f(self):
a = lambda i,j: self.sigma[i,j]*i**2
return a
没有明确地重写它。这是最好的方法吗?
附加信息: 在我的程序 f returns 中有五个函数而不是一个。在程序的上下文中,将所有这些函数封装在一个函数 f.
中是有意义的如果您的 sigma
是一个 numpy 数组,您的 f
将按预期工作:
import numpy as np
def f(sigma):
a = lambda i: sigma*i**2
return a
sigma = np.random.rand(2, 4)
print(sigma)
print(f(sigma)(2))
# [[0.40567906 0.86706289 0.37468664 0.45059327]
# [0.57024244 0.17452584 0.05394594 0.03218902]]
# [[1.62271624 3.46825154 1.49874657 1.80237307]
# [2.28096976 0.69810334 0.21578375 0.12875607]]
如果您的 sigma
是列表的列表,那么您可以使用 numpy 中的 vectorize 并获取函数数组:
sigma = [[1, 2], [3, 4]]
vfunc = np.vectorize(f)
print(vfunc(sigma))
#[[<function f.<locals>.<lambda> at 0x000002DC116DE7B8>
# <function f.<locals>.<lambda> at 0x000002DC116DEC80>]
#
# [<function f.<locals>.<lambda> at 0x000002DC116DEBF8>
# <function f.<locals>.<lambda> at 0x000002DC116DE730>]]
也许 np.vectorize 会做类似的事情?
矢量化 f 将 return 一个 lambda 矩阵。每个都以 i 作为输入。
import numpy as np
def f(sigma):
a = lambda i: sigma*i**2
return a
f_vectorized = np.vectorize(f)
sigma = [[0, 1], [2, 3], [4, 5]]
for i in [0, 1, 2]:
for j in [0, 1]:
print(f_vectorized(sigma)[i, j](i))
# prints 0, 0, 2, 3, 16, 20