Мне нужно использовать двумерный массив NumPy из соображений производительности, но мне также нужно иметь возможность индексировать каждый элемент.Индексы будут models1
и models2
, которые подклассы django.db.models.Model
.
. Мне нужно иметь возможность получать и устанавливать элементы, нарезать и передавать списки индексов, фильтровать и так далее, так же, какесли бы это был обычный NumPy с целочисленными индексами.Но мне также нужно быть в состоянии сделать это, используя упомянутые индексы.
Примеры операций, которые я должен уметь:
arr[m1]
arr[:,m2]
arr[(0,1,4),:] = N
Существует ли стандартизированный способ индексирования массивов NumPy?Я еще не смог найти его.
Я пробовал это:
class IndexedArray:
def __init__(self, models1, models2):
self.shape = (len(models1), len(models2))
self.arr = np.full(self.shape, 1)
self.models1 = [m1 for m1 in models1]
self.models2 = [m2 for m2 in models2]
self.model1_indices = {m1: i for i, m1 in enumerate(self.models1)}
self.model2_indices = {m2: i for i, m2 in enumerate(self.models2)}
def __setitem__(self, key, value):
if isinstance(key, tuple):
i = self.models1_indices[key[0]]
j = self.models2_indices[key[1]]
self.arr[i, j] = value
else:
i = self.models1_indices[key]
self.arr[i] = value
def __getitem__(self, key):
if isinstance(key, tuple):
i = self.models1_indices[key[0]]
j = self.models2_indices[key[1]]
return self.arr[i, j]
i = self.models1_indices[key]
return self.arr[i]
def get_index(self, o):
if isinstance(o, Model1):
return self.models1_indices[o]
if isinstance(o, Model2):
return self.models2_indices[o]
raise TypeError
Но количество доступных операций ограничено.Я могу только получить и установить arr[m1,m2]
, arr[m1]
, но не arr[:,m2]
, потому что срезы не поддерживаются (не то, чтобы они имели смысл, но тогда как я могу присвоить массу второму измерению? Что я должен передать первыминдекс?), и это все.Фильтрация также не поддерживается ...