2014-10-02 2 views
2

У меня есть массив 2D NumPy (N, D), где каждая строка имеет уникальный индекс (неотрицательное целое число). Индексы строк увеличиваются. Например, индексы моего массива (4,D) могут быть (10, 20, 21, 30).Структура данных для индексированного массива NumPy

Я ищу структуру данных, которая позволяет мне:

  • Выбор строк из их индексов: arr[21] вместо arr[2] (то есть абсолютное, а не относительное индексации)

  • Преобразовать произвольный список абсолютных индексов относительных индексов и наоборот. Например, конвертируйте назад и вперед между [10, 30, 21, 21] и [0, 3, 2, 2].

Какой чистый способ реализовать это?

  1. Создание нового класса, обертывание данных (массив NumPy) и индекс. Реализация __getitem__, __setitem__ и т.д.

  2. Создание класса, производный от ndarray и первостепенную индексацию таких, которые используются абсолютные показатели.

  3. Сохранение отдельных объектов для данных и индекса (как в виде массивов NumPy), реализация таких функций, как select(data, index), и использование этого везде в коде.

  4. нравится (3), но индекс является экземпляром пользовательского класса, обеспечивая такие методы, как index.to_relative(data) и index.to_absolute(data)

  5. Использование маскированные массивов.

Я уверен, что можно найти другие подходы. Я могу найти плюсы и минусы для всех этих подходов. Какой был бы самый чистый способ сделать это? Есть ли «стандартный» способ сделать это, о котором я бы не знал?

+0

Этот вопрос не понимаю. Когда вы говорите '(N, D)', вы имеете в виду, что у вас есть N-мерный массив? И, когда вы говорите, что индексы могут быть '(10, 20, 21, 30)', вы имеете в виду, что это форма вашего массива? Не могли бы вы привести примеры того, что вы пытаетесь сделать, и как это не работает? – farenorth

+0

3. Использование функции будет самым простым.Но если вы предпочитаете нотацию индексирования ('[]') или нотацию аргументов, в «np.lib.index_tricks» есть примеры классов, реализующих пользовательские функции '__getitem__'. – hpaulj

+0

@farenorth Я уточнил вопрос. Мой массив 2-мерный, форма '(N, D)'. '(10, 20, 21, 30)' - это просто произвольные целые числа, связанные с строками (в этом случае четыре строки, поэтому N = 4). Я знаю, как реализовать все 5 подходов, но я не уверен, какой из них самый чистый. –

ответ

0

Я не думаю, что существует стандартный способ сделать это, но не слишком сложно реализовать.

Для (3), если вы используете список индекса вместо массива, вы можете использовать метод index, чтобы получить индекс значения:

i = [10,20,21,30] 
x = numpy.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) 
x[i.index(20)] # -> array([4,5,6]) 

Конечно, вы не можете назначить с помощью это и изменение структуры может быть болью.

В зависимости от сложности программы я бы использовал это непосредственно или создавал класс, который инкапсулирует это, как вы предложили. Я думаю, что оба метода могут быть квалифицированы как «чистые», поскольку первый не требует каких-либо других функций или определений классов, а второй делает использование очень простым и интуитивно понятным.

+1

Я забыл сказать: мои массивы довольно большие (N может иметь 100 миллионов элементов, D может быть от 1 до 1000), и мне может понадобиться преобразовать миллионы индексов между относительными и абсолютными координатами. Я не уверен, как «list.index» будет масштабироваться для этих томов. –