рассмотрите следующий код:
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
принимает массив значений, параметр окна и дескриптор пользовательской функции и возвращает массив, содержащий значения, выведенные дескриптором функции в window
точках данных во время массива входных данных - универсальный метод прокатки. У меня нет доступа к изменению этого метода.
Как вы можете видеть, _method_i_do_not_have_access_to
передает один вход в дескриптор функции, который является массивом данных, переданным в _method_i_do_not_have_access_to
. Этот дескриптор функции вычисляет только выходные данные на основе window
точек данных для одного массива данных, переданного ему через _method_i_do_not_have_access_to
.
Что мне нужно сделать, это разрешить _my_func
(дескриптор функции, переданный _method_i_do_not_have_access_to
) работать с data_b
и data_c
в дополнение к массиву, который передается с _my_func
через _method_i_do_not_have_access_to
при тех же window
показателях . data_b
и data_c
определены глобально в MyClass class
.
Единственный способ, которым я думал об этом, - включить ссылки на data_b
и data_c
в _my_func
, например:
def _my_func(val):
b = self.data_b
c = self.data_c
# do some calculations
return sum(val)
Однако мне нужно нарезать b
и c
по тем же индексам, что и val
(помните, val
- это отрезок длины window
массива, который передается через _method_i_do_not_have_access_to
).
Например, если в настоящее время цикл в _method_i_do_not_have_access_to
работает с индексами 45 -> 50
во входном массиве, _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)
Есть мысли о том, как мне это сделать?