封装函数的包装器

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