У меня есть массив 2D NumPy (N, D)
, где каждая строка имеет уникальный индекс (неотрицательное целое число). Индексы строк увеличиваются. Например, индексы моего массива (4,D)
могут быть (10, 20, 21, 30)
.Структура данных для индексированного массива NumPy
Я ищу структуру данных, которая позволяет мне:
Выбор строк из их индексов:
arr[21]
вместоarr[2]
(то есть абсолютное, а не относительное индексации)Преобразовать произвольный список абсолютных индексов относительных индексов и наоборот. Например, конвертируйте назад и вперед между
[10, 30, 21, 21]
и[0, 3, 2, 2]
.
Какой чистый способ реализовать это?
Создание нового класса, обертывание данных (массив NumPy) и индекс. Реализация
__getitem__
,__setitem__
и т.д.Создание класса, производный от
ndarray
и первостепенную индексацию таких, которые используются абсолютные показатели.Сохранение отдельных объектов для данных и индекса (как в виде массивов NumPy), реализация таких функций, как
select(data, index)
, и использование этого везде в коде.нравится (3), но индекс является экземпляром пользовательского класса, обеспечивая такие методы, как
index.to_relative(data)
иindex.to_absolute(data)
Использование маскированные массивов.
Я уверен, что можно найти другие подходы. Я могу найти плюсы и минусы для всех этих подходов. Какой был бы самый чистый способ сделать это? Есть ли «стандартный» способ сделать это, о котором я бы не знал?
Этот вопрос не понимаю. Когда вы говорите '(N, D)', вы имеете в виду, что у вас есть N-мерный массив? И, когда вы говорите, что индексы могут быть '(10, 20, 21, 30)', вы имеете в виду, что это форма вашего массива? Не могли бы вы привести примеры того, что вы пытаетесь сделать, и как это не работает? – farenorth
3. Использование функции будет самым простым.Но если вы предпочитаете нотацию индексирования ('[]') или нотацию аргументов, в «np.lib.index_tricks» есть примеры классов, реализующих пользовательские функции '__getitem__'. – hpaulj
@farenorth Я уточнил вопрос. Мой массив 2-мерный, форма '(N, D)'. '(10, 20, 21, 30)' - это просто произвольные целые числа, связанные с строками (в этом случае четыре строки, поэтому N = 4). Я знаю, как реализовать все 5 подходов, но я не уверен, какой из них самый чистый. –