Есть ли значение удержания, пока функция условия в numpy? - PullRequest
1 голос
/ 05 июля 2019

Например что-то вроде:

pre_hold_list = [-2,0,0,-1,0,0,0,3,0,0]
hold_condition = lambda x:x != 0
output = np.hold(pre_hold_list, hold_condition)
[-2,-2,-2,-1,-1,-1,-1,3,3,3] #result of output

Здесь условие состоит в том, что текущее значение не равно нулю, функция будет удерживать значение, которому удовлетворяется это условие, до следующего значения, которое удовлетворяет этому условию (то есть оно будет содержать -2, затем -1, затем 3).

Поиск np.hold () или np.step () ничего не дает мне в Google.

Ответы [ 2 ]

2 голосов
/ 05 июля 2019

Nevermind Я закодировал функцию, которая делает это, используя совокупный характер cumsum и diff.Если есть способ улучшить это, пожалуйста, дайте мне знать.

def holdtil(x, condition):
    condition_index = np.where(condition)[0]
    condition_value = np.take(x, condition_index)
    condition_value_diff = np.diff(condition_value)

    holdtil_diff = np.zeros(len(x))
    holdtil_diff[condition_index[0]] = condition_value[0]
    holdtil_diff[condition_index[1:]] = condition_value_diff
    return np.cumsum(holdtil_diff)

РЕДАКТИРОВАТЬ: я проверил производительность между моим решением и @Willem Van Onsem, и мое имеет очень небольшое преимущество во времени.

def hold_func():
    start = time.time()
    for i in range(1000):
        x = np.random.randint(-5, 5, 1000)
        hold(x, x != 0)
    print(time.time() - start)

def holdtil_func():
    start = time.time()
    for i in range(1000):
        x = np.random.randint(-5, 5, 1000)
        holdtil(x, x != 0)
    print(time.time() - start)

hold_func()
holdtil_func()

#0.055173397064208984
#0.045740604400634766
1 голос
/ 05 июля 2019

Здесь можно использовать трюк, используя cumsum(..) [numpy-doc] и diff() [numpy-doc]:

import numpy as np

def hold(iterable, condition):
    cond = np.array(condition)
    vals = np.array(iterable)
    a = vals * cond
    a[cond] = np.diff(np.hstack(((0,), a[cond])))
    return a.cumsum()

Первый параметр - это iterable, содержащий элементы, второй параметр condition - это итерация той же длины с логическими значениями.

Например,:

>>> a
array([-2,  0,  0, -1,  0,  0,  0,  3,  0,  0])
>>> hold(a, a != 0)
array([-2, -2, -2, -1, -1, -1, -1,  3,  3,  3])
>>> hold(a, a != 0)
array([-2, -2, -2, -1, -1, -1, -1,  3,  3,  3])

Функция работает следующим образом.Сначала мы делаем копию двух итераций (и конвертируем их в массивы, если это еще не так).Вы можете не указывать, что если это пустые массивы.

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

Затем мы вычисляемразница между каждым элементом, где выполняется условие, и следующим, и мы устанавливаем это a.Наконец, мы можем использовать кумулятивную сумму a, поскольку .diff() гарантирует, что это приведет к правильным повторениям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...