Создание массива без определенных диапазонов - PullRequest
1 голос
/ 03 марта 2012

В Python у меня есть numpy.ndarray с именем a и список индексов с именем b.Я хочу получить список всех значений a, которые не находятся в -10..10 местах вокруг индексов b.Это мой текущий код, выполнение которого занимает много времени из-за выделения данных (a очень большой):

    aa=a
    # Remove all ranges backwards
    for bb in b[::-1]:
        aa=np.delete(aa, range(bb-10,bb+10))

Есть ли способ сделать это более эффективно?Желательно с небольшим количеством памяти.

Ответы [ 2 ]

2 голосов
/ 03 марта 2012

np.delete примет массив указателей любого размера.Вы можете просто заполнить весь свой массив индикаторов и выполнить удаление один раз, следовательно, только освобождение и перераспределение один раз..1006 *

0 голосов
/ 03 марта 2012

Можете ли вы найти определенное число, которое, как вы уверены, не будет в a, а затем установить все индексы вокруг индексов b на это число, чтобы впоследствии его можно было удалить

import numpy as np
for i in range(-10, 11):
    a[b + i] = number_not_in_a
values = set(np.unique(a)) - set([number_not_in_a])

Этот код вообще не будет выделять новую память для a, ему нужен только один созданный объект диапазона, и он выполняет работу ровно с 22 оптимизированными с помощью n-битовых операций (ну, 43, если считать операции b + i) плюс стоимость превращения возвращаемого массива unique в set.

Осторожно, если b включает индексы, которые меньше 10, «зона» number_not_in_a вокруг этих индексов будет переходить на другой конец массива. Если b включает в себя индексы, превышающие len(a) - 11, операция завершится с ошибкой IndexError в какой-то момент.

...