Вложенная л oop с индексами - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь решить следующую упрощенную задачу. У меня есть массив с данными и два массива с сохраненными индексами начала и конца. Я хотел бы удвоить значения набора данных, попадающие между индексами (например, между start [0], end [0] и start [1], end [1] et c). Я попробовал вложенный l oop следующим образом:

data = np.array([0,1,2,8,4,5,6,5,4,5,6,7,8])
start = np.array([0,5,7])
end = np.array([3,6,9])

new_data = np.zeros(len(data))
for i in range(len(start)):
   for j in range(len(data)):
       if (j >= start[i]) & (j <= end[i]):
            new_data[j] = data[j]*2
       else:
            new_data[j] = data[j]

Результат должен быть [0,2,4,16,4,10,12,10,8,10,6,7,8 ], и все же код возвращает: [0. 1. 2. 8. 4. 5. 6. 10. 8. 10. 6. 7. 8.]

Только часть между последними индексами правильный. Есть идеи почему? А что, если я хочу утроить значения, не удовлетворяющие выражению if?

Ответы [ 3 ]

0 голосов
/ 27 апреля 2020

Инициализируйте new_data с помощью data и удалите else.

Редактировать: Это должно ответить вам, это более эффективно, так как вы перебираете весь массив количество интервалов, которое у вас есть, и это будет медленно для больших входов, но здесь вы один раз go пройдете через массив. И если вы хотите утроить другие элементы, наивное решение состоит в том, чтобы умножить new_data на 3 до for l oop, поэтому поместите new_data = np.copy(data)*3.

import numpy as np

data = np.array([0,1,2,8,4,5,6,5,4,5,6,7,8])
start = np.array([0,5,7])
end = np.array([3,6,9])
new_data = np.copy(data)    # change to new_data = np.copy(data)*3 to triple other elements.

for i in range(len(start)):
    for j in range(start[i], end[i]+1):
        new_data[j] = data[j]*2

Еще одно замечание в вашем код (j >= start[i]) & (j <= end[i]), это можно упростить до start[i] <= j <= end[i], возможно, быстрее.

0 голосов
/ 27 апреля 2020

Я бы предложил использовать команду python zip для одновременной распаковки нескольких списков.

Объяснение кода: Поскольку точки данных, которые не принадлежат ни одному из подсписков, остаются прежними, я использовал метод numpy copy, чтобы создать новую копию ваших исходных данных. Затем я умножил ваши желаемые списки на два.

import numpy as np

data = np.array([0, 1, 2, 8, 4, 5, 6, 5, 4, 5, 6, 7, 8])
start = np.array([0, 5, 7])
end = np.array([3, 6, 9])

new_data = data.copy() #Not to mess up our original dataset.
for s, e in zip(start, end):
    new_data[s:e+1] *= 2 #Because it's an inclusive set.

0 голосов
/ 27 апреля 2020

Вы постоянно присваиваете new_data, перезаписывая предыдущие изменения.

Т.е.:

new_data[j] = data[j]*2 # won't work
data[j] = data[j]*2     # will work. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...