Назначение нескольких индексов массива одновременно в Python / Numpy - PullRequest
3 голосов
/ 17 августа 2011

Я хочу быстро (надеюсь, без цикла for) создать массив Numpy в форме:

array([a,a,a,a,0,0,0,0,0,b,b,b,0,0,0, c,c,0,0....])

Где a, b, c и другие значения повторяются в разных точках для разных диапазонов,Я действительно думаю о чем-то вроде этого:

import numpy as np
a = np.zeros(100)
a[0:3,9:11,15:16] = np.array([a,b,c])

Что, очевидно, не работает.Любые предложения?

Редактировать (jterrace ответил на оригинальный вопрос): Данные поступают в виде массива N * M Numpy.Каждая строка состоит в основном из нулей, иногда перемежаясь последовательностями ненулевых чисел. Я хочу заменить все элементы каждой такой последовательности на последнее значение последовательности.Я воспользуюсь любым быстрым методом, чтобы сделать это! Несколько раз используя where и diff, мы можем получить индексы запуска и остановки каждого запуска.

raw_data = array([.....][....])
starts = array([0,0,0,1,1,1,1...][3, 9, 32, 7, 22, 45, 57,....])
stops = array([0,0,0,1,1,1,1...][5, 12, 50, 10, 30, 51, 65,....])
last_values = raw_data[stops]
length_to_repeat = stops[1]-starts[1]

Обратите внимание, что начинается [0] иОстановки [0] - это та же информация (по какой строке происходит запуск).На данный момент, поскольку единственный известный мне маршрут - это то, что предлагает jterrace, нам нужно пройти через некоторые искажения, чтобы получить аналогичные начальные / конечные позиции для нулей, а затем чередовать нулевые старт / стоп со значениями старт / стоп,и чередовать число 0 с массивом last_values.Затем мы перебираем каждую строку, выполняя что-то вроде:

for i in range(N)
    values_in_this_row = where(starts[0]==i)[0]
    output[i] = numpy.repeat(last_values[values_in_this_row], length_to_repeat[values_in_this_row])

Имеет ли это смысл, или я должен объяснить что-то еще?

Ответы [ 2 ]

4 голосов
/ 17 августа 2011

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

>>> import numpy
>>> values = numpy.array([1,0,2,0,3,0])
>>> counts = numpy.array([4,5,3,3,2,2])
>>> numpy.repeat(values, counts)
array([1, 1, 1, 1, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 3, 3, 0, 0])
0 голосов
/ 17 августа 2011

вы можете использовать numpy.r_:

>>> np.r_[[a]*4,[b]*3,[c]*2]
array([1, 1, 1, 1, 2, 2, 2, 3, 3])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...