Вы можете достичь объекта, подобного тому, который вы описываете, создав класс, который оборачивает пустой массив и реализует пользовательский метод __getitem__
. Это может выглядеть примерно так, как показано ниже, где factor
- это фактор, с которым вы хотите повысить частоту.
class UpSampled:
__slots__ = ('arr', 'factor')
def __init__(self, arr, factor):
self.arr = arr
self.factor = factor
def __getitem__(self, key):
return self.arr[key // self.factor]
Затем вы бы использовали его, как показано ниже:
o = UpSampled(np.array([
UpSampled(np.array([0, 1, 2]), 10),
UpSampled(np.array([3, 4, 5]), 10),
UpSampled(np.array([6, 7, 8]), 10),
]), 10)
print(o[23][13]) # prints 7
Если вам нужно, чтобы объект был итеративным, вы бы также реализовали __next__
и __iter__
:
class UpSampled:
__slots__ = ('arr', 'factor', '__index')
def __init__(self, arr, factor):
self.arr = arr
self.factor = factor
self.__index = 0
def __getitem__(self, key):
return self.arr[key // self.factor]
def __iter__(self):
self.__index = 0
return self
def __next__(self):
try:
result = self[self.__index]
except IndexError:
raise StopIteration
self.__index += 1
return result
Хотя я не уверен, что это будет хорошо работать с библиотеками, которые специально ожидают массив numpy.