доступ к массиву - PullRequest
       4

доступ к массиву

1 голос
/ 23 июля 2011

Мне нужно создать массив из N элементов, но я хочу получить доступ к массив со смещением Noff, т.е. первый элемент должен быть в Noff и не в 0. В C это просто сделать с помощью некоторой простой арифметики с указателями, т.е. Я Malloc массив, а затем определить указатель и переместить его соответствующим образом.

Кроме того, я не хочу выделять N + Noff элементов, а только N элементов.

Теперь для numpy есть много методов, которые приходят мне на ум:

(1) определяет функцию-оболочку для доступа к массиву (2) переписать оператор [] (3) и т. Д.

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

Большое спасибо! Mark

Ответы [ 3 ]

2 голосов
/ 25 июля 2011

Я бы очень осторожно переопределил оператор [] методом __getitem__(). Хотя это будет хорошо с вашим собственным кодом, я легко могу представить, что когда массив будет передан в произвольную библиотечную функцию, у вас могут возникнуть проблемы.

Например, если функция явно попыталась получить все значения в массиве как A[0:-1], она отобразится в A[offset:offset-1], что будет пустым массивом для любого положительного или отрицательного значения offset. Это может быть немного надуманным, но это иллюстрирует общую проблему.

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

2 голосов
/ 23 июля 2011

Используйте A[n-offset].это превращает offset в offset+len(A) в 0 в len(A).

1 голос
/ 25 июля 2011

Вы уже дали (1) и (2) как более или менее разумные методы. Чтобы проверить скорость для таких вещей, попробуйте timeit магическую функцию в ipython. Пример использования:

A = array(range(10))
Noff = 2
wrapper_access = lambda i: A[i - Noff]
print wrapper_access(2)   #0
print wrapper_access(11)  #9
print wrapper_access(1)   #9 = A[-1]
timeit wrapper_access(5)

На моей машине я получаю вывод от timeit 10000000 loops, best of 3: 193 ns per loop

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