Индексирование массива NumPy как словарь - PullRequest
0 голосов
/ 12 июня 2018

Мне нужно использовать двумерный массив 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], потому что срезы не поддерживаются (не то, чтобы они имели смысл, но тогда как я могу присвоить массу второму измерению? Что я должен передать первыминдекс?), и это все.Фильтрация также не поддерживается ...

1 Ответ

0 голосов
/ 12 июня 2018

Если я хорошо понимаю, вы захотите дать ключи моделей, а также их индекс в диктантах modelX_indices?

Вот как я мог бы подойти к этой проблеме:

  • Если параметром ключа был кортеж или список, мы рассматриваем каждую запись внутри как отдельный ключ, чтобы преобразовать его в int.
  • Если ключ является срезом, мы его не трогаем *.
  • Если ключом является Модель, мы конвертируем его в целое число, и не трогаем его, если это уже целое число.

Следующая функция выполняет эту работу:

def key_to_int(self, key):
    if isinstance(key, (tuple, list)):
        return tuple(key_to_int(k) for k in key)
    if isinstance(key, Model1):
        return self.models1_indices[key]
    if isinstance(key, Model2):
        return self.models2_indices[key]
    return key

*: За исключением случаев, когда у вас есть смысл нарезать их с помощью моделей?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...