考虑以下代码:
class MyClass(object):
def __init__(self):
self.data_a = np.array(range(100))
self.data_b = np.array(range(100,200))
self.data_c = np.array(range(200,300))
def _method_i_do_not_have_access_to(self, data, window, func):
output = np.empty(np.size(data))
for i in xrange(0, len(data)-window+1):
output[i] = func(data[i:i+window])
output[-window+1:] = np.nan
return output
def apply_a(self):
a = self.data_a
def _my_func(val):
return sum(val)
return self._method_i_do_not_have_access_to(a, 5, _my_func)
my_class = MyClass()
print my_class.apply_a()
_method_i_do_not_have_access_to方法采用numpy数组,窗口参数和用户定义的函数句柄,并返回一个数组,该数组包含输入数据数组时窗口数据点上的函数句柄输出的值 – 一种通用的滚动方法.我无权更改此方法.
如您所见,_method_i_do_not_have_access_to将一个输入传递给函数句柄,该句柄是传递给_method_i_do_not_have_access_to的数据数组.该函数句柄仅计算通过_method_i_do_not_have_access_to传递给它的一个数据数组上的基于输出的窗口数据点.
我需要做的是允许_my_func(传递给_method_i_do_not_have_access_to的函数句柄)除了在同一窗口索引通过_method_i_do_not_have_access_to传递给_my_func的数组外,还对data_b和data_c进行操作. data_b和data_c在MyClass类中全局定义.
我想到这样做的唯一方法是在_my_func中包含对data_b和data_c的引用,如下所示:
def _my_func(val):
b = self.data_b
c = self.data_c
# do some calculations
return sum(val)
但是,我需要在与val相同的索引处切片b和c(记住val是通过_method_i_do_not_have_access_to传递的数组的长度窗口切片).
例如,如果_method_i_do_not_have_access_to中的循环当前正在索引45上运行 – >在输入数组上,_my_func必须在b和c上的相同索引上运行.
最终的结果是这样的:
def _my_func(val):
b = self.data_b # somehow identify which slide we are at
c = self.data_c # somehow identify which slide we are at
# if _method_i_do_not_have_access_to is currently
# operating on indexes 45->50, then the sum of
# val, b, and c should be the sum of the values at
# index 45->50 at each
return sum(val) * sum(b) + sum(c)
有关如何实现这一目标的任何想法?
解决方法:
问题是_my_func将如何知道哪些操作?如果在调用函数时事先知道了indizes,最简单的方法就是使用lambda:lambda val:self._my_func(self.a,self.b,index,val),_my_func明显改变以适应其他参数.
由于你不知道indizes,你必须在self.c周围编写一个包装器来记住上次访问的索引(或者更好地捕获切片操作符)并将其存储在一个变量中供你的函数使用.
编辑:敲了一个小例子,不是特别好的编码风格和所有,但应该给你的想法:
class Foo():
def __init__(self, data1, data2):
self.data1 = data1
self.data2 = data2
self.key = 0
def getData(self):
return Foo.Wrapper(self, self.data2)
def getKey(self):
return self.key
class Wrapper():
def __init__(self, outer, data):
self.outer = outer
self.data = data
def __getitem__(self, key):
self.outer.key = key
return self.data[key]
if __name__ == '__main__':
data1 = [10, 20, 30, 40]
data2 = [100, 200, 300, 400]
foo = Foo(data1, data2)
wrapped_data2 = foo.getData()
print(wrapped_data2[2:4])
print(data1[foo.getKey()])
标签:python,arrays,numpy 来源: https://codeday.me/bug/20190704/1379966.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。