2016-12-20 5 views
1

Предположим, что у вас есть два одинаковых размера. Первый список содержит только нули и единицы, а начальное значение второго списка равно некоторому фиксированному числу. Другие значения второго массива зависят от одних и тех же значений первого списка. Связь между ними заключается в том, что если значение в первом списке равно 0, одноиндексное значение второго списка равно предыдущему, во всех остальных случаях равно некоторому другому значению. Чтобы уточнить мой вопрос, я написал код ниже с помощью цикла for. Каков способ решить эту проблему без цикла?Логическая итерация по массиву numpy

Code 
a = np.array([0, 1, 0, 0, 0, 1, 0, 0, 1]) 
b = np.zeros_like(a) 
b[0] = 5 
for i in range(1, a.size): 
    if a[i] == 0: 
     b[i] = b[i-1] 
    else: 
     b[i] = np.random.randint(5) 
+0

Так как ваша конструкция явно зависит от предыдущих итераций, это не просто на все, что он может быть векторизациями. Не обязательно * невозможно *, но сложно. –

+0

Если ваш массив 'a' не содержит смежных, это можно сделать легко. Это случай, случайно? –

+0

Я знаю, это сложно. Но я пытаюсь найти это, есть ли прямое решение, например, функция «scipy.signal.lfiler». С этой функцией я могу выполнить численное предыдущее значение, зависящее от итерации. –

ответ

2

Вот Векторизованный подход -

offset = int(a[0]!=0) 
N = (np.count_nonzero(a!=0)) - offset # no. of rand num to be generated 
rand_num = np.append(5,np.random.randint(0,5,N)) 
out = rand_num[(a!=0).cumsum() - offset] 
+0

Разве это не поддерживает одни и те же значения между одними, а не создает новые рандомы внутри? Запуск с помощью 'a = np.array ([0, 1, 0, 0, 1, 1, 0, 0, 1])' Я бы ожидал, что второе значение будет равно 5; если я не понял этот вопрос. –

+0

@AndrasDeak Ну, в этом втором случае, так как 'a [i]! = 0:' должен перейти в часть ELSE и сгенерировать новое число в '[0,5]'. Итак, у нас было бы случайное число на второй позиции, верно? – Divakar

+0

Хорошее решение! Но что, если бы вместо нулей и единиц были строки, например, «a» и «b»)? –

Смежные вопросы