Сравнение значений в массиве и вычисление разницы в диапазонах Numpy Python

#arrays #python-3.x #numpy #compare #subtraction

Вопрос:

Я пытаюсь закодировать функцию, которая проверяет, снизилось ли значение более чем на 100 между диапазоном значений, поскольку val 103.0, 58.8, 35, -47 значения изменились со 103 до -47, что равно -150, а также 58.8, 35, -47 значения изменились с 58 до -47, то есть уменьшились на -105. Таким образом, это 2 случая, когда произошло падение с начального значения до значения, эквивалентного или превышающего 100. Он проверяет, было ли уменьшение на -100 для каждого значения в массиве до конца массива. Поэтому, если бы он взял число 7.4 , он проверил бы наличие остальной части массива 1180.9, 0.6, 103.0, 58.8, 35, -47, 47.2, 78.1, 37.8 , и если бы значение было 1180.9 , то он проверил бы значения 0.6, 103.0, 58.8, 35, -47, 47.2, 78.1, 37.8 . как бы я смог сделать это с numpy.

 import numpy as np 

val = np.array([7.4, 1180.9, 0.6, 103.0, 58.8, 35, -47, 47.2, 78.1, 37.8])
val2 = np.array([46.5, 55.7, 7.0, 19.6, 7.6, 36.5, 34.7, 101.9, 179.7, 85.5])
val3 = np.array([120, 20, -80, -5.5])

differences = 100

def run(values):
    minimums = np.subtract.accumulate(values)
    print(f'Number it has been below or equal to {differences} is {values}')
    return minimums
    
print(run(val))
print(run(val2))
print(run(val3))
 

Ожидаемые результаты:

 Number it has been below or equal to -100 is 3
Number it has been below or equal to -100 is 0
Number it has been below or equal to -100 is 2
 

Ответ №1:

 import numpy as np

val = np.array([7.4, 1180.9, 0.6, 103.0, 58.8, 35, -47, 47.2, 78.1, 37.8]) 
val2 = np.array([46.5, 55.7, 7.0, 19.6, 7.6, 36.5, 34.7, 101.9, 179.7, 85.5]) 
val3 = np.array([120, 20, -80, -5.5]) 

def run( arr, limit ): 
    row_mins = np.triu( arr[None, : ] - arr[ :, None ] ).min(axis = 1 ) 
    return np.count_nonzero( row_mins <= -limit ) 
 

Расширенный:

 def run( arr, limit ):
    # Uncomment the print statements to see what is happening.
    temp = arr[None, : ] - arr[ :, None ]  # difference of each element all elements
    # print( temp )
    temp1 = np.triu( temp )  # Keep the upper triangle, set lower to zero
    # print( temp1 )
    row_mins = temp1.min( axis = 1 )   # Minimum for each row
    # print( row_mins )
    return np.count_nonzero( row_mins <= -limit ) # Count how many row_mins are <= limit
 

Результаты:

 run(val, 100)   # 3
run(val2, 100)  # 0
run(val3, 100)  # 2
 
 

Комментарии:

1. Спасибо, это работает, я попытался сделать наоборот, когда вместо просадки в 100 искал рост в 100. Но на самом деле это не работает, я попробовал следующий код: row_mins = np.triu( arr[None, : ] arr[ :, None ] ).min(axis = 1 ) return np.count_nonzero(row_mins >= limit )

2. Я не совсем уверен, что вы пытаетесь сделать, но я думаю, что вам все еще нужны различия, а не сумма, и, вероятно, вам нужен максимум, а не минимум. Так row_maxs = np.triu( arr[None, : ] - arr[ :, None ] ).max(axis = 1 ) . Это работает?