массив python / numpy: заменить элемент на N строк до - PullRequest
0 голосов
/ 29 мая 2018

В python 3 (3.6.5) у меня есть данные в (гораздо более длинном) массиве numpy, выглядящем так:

data = np.array([[16347,     0,    60],[16353,     0,    92],[16382,     0,     1],[17867,     0,     2],[20188,     0,     3],[21459,     0,   512],[21873,     0,    71],[22031,     0,     4],[23072,     0,    61],[25378,     0,    60],[25385,     0,    82],[25410,     0,     1],[26895,     0,     2],[29233,     0,     3],[31695,     0,    71],[31845,     0,     4],[32886,     0,    61],[35069,     0,    60],[35075,     0,    90],[35104,     0,     1]])

Первые два столбца могут быть проигнорированы в этом вопросе.В-третьих, я хотел бы заменить все 2 записи значением в том же столбце, двумя строками ранее.Например, в данных примера есть 2 в 4-й строке, и его следует заменить на число 92 в строке 2. Аналогично, 2 в строке 13 необходимо заменить на 82по строке 11 и т. д.

Короче говоря, мне нужно найти все записи 2 в столбце внутри массива-пустышки и заменить их на любое значение, которое было в том же столбце 2 строки ранее.

Буду признателен за любые советы или идеи.Спасибо!

1 Ответ

0 голосов
/ 29 мая 2018

Вы можете использовать np.where () и np.roll (), чтобы сделать это:

data[:,-1]=where(data[:,-1]==2,np.roll(data[:,-1],2),data[:,-1])

Здесь

data[:,-1]

Изолирует 3-й столбец, который вас интересует,и где () возвращает массив, заполненный значениями, которые зависят от условия.Если условие, что значение равно 2, имеет значение True, оно возвращает соответствующее значение из

np.roll(data[:,-1],2)

, которое является исходным столбцом, смещенным вперед на 2, при этом последние два значения не становятся первыми двумя значениями.

Результат для входного массива:

[[16347     0    60]
 [16353     0    92]
 [16382     0     1]
 [17867     0     2]
 [20188     0     3]
 [21459     0   512]
 [21873     0    71]
 [22031     0     4]
 [23072     0    61]
 [25378     0    60]
 [25385     0    82]
 [25410     0     1]
 [26895     0     2]
 [29233     0     3]
 [31695     0    71]
 [31845     0     4]
 [32886     0    61]
 [35069     0    60]
 [35075     0    90]
 [35104     0     1]]

- это желаемый результат:

[[16347     0    60]
 [16353     0    92]
 [16382     0     1]
 [17867     0    92]
 [20188     0     3]
 [21459     0   512]
 [21873     0    71]
 [22031     0     4]
 [23072     0    61]
 [25378     0    60]
 [25385     0    82]
 [25410     0     1]
 [26895     0    82]
 [29233     0     3]
 [31695     0    71]
 [31845     0     4]
 [32886     0    61]
 [35069     0    60]
 [35075     0    90]
 [35104     0     1]]
...