Чтобы найти N Максимальные индексы массива NumPy, соответствующие значения которого должны быть больше, чем M в другом массиве - PullRequest
0 голосов
/ 08 февраля 2019

у меня 3 Numpy arrays each of length 107952899.

Скажем:

1. Time = [2.14579526e+08 2.14579626e+08 2.14579726e+08 ...1.10098692e+10  1.10098693e+10]
2. Speed = [0.66 0.66 0.66 .............0.06024864 0.06014756]

3. Brak_press = [0.3, 0.3, 0.3 .............. 0.3, 0.3]

Что это значит

Каждое значение индекса во времени соответствует одному и тому же значению индекса в массиве скорости и тормоза.

Time                Speed         Brake
2.14579526e+08      0.66          0.3
.
.

Требование

№ 1: Я хочу find the indices in Speed array, чьи values внутри greater than 20

№ 2: дляэти индексы, what will be values in Brake Array

№ 3: Теперь я хочу найти Top N Maximum Value indices in Brake Array и сохранить его в другом списке / массиве

Итак, наконец, если я возьму один индекс из Top N Maximum Indices и используюв массиве Brake & Speed ​​он должен показывать ..

Brake[idx] = valid Value & more importantly Speed [idx] = Value > than 20

Общее резюме

Проще говоря, мне нужно найти индексы точки максимума N, соответствующие значения скорости которых должны быть большечем 20

Что я пробовал

    speed_20 = np.where(Speed > 20) # I got indices as tupple 
brake_values = Brake[speed_20]  # Found the Brake Values corresponds to speed_20 indices

После этого я пробовал argsort / argpartition, но ни один из результатов не соответствует моему требованию

Запрос

Я верю тамбудет лучшим способом сделать это .. Пожалуйста, пролите немного света

(я преобразовал вышеупомянутые np arrays в pandas df, все работает нормально, из-за проблем с памятью, которые я предпочитаю делать с использованием пустых операций)

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Может быть, это вариант, который вы можете рассмотреть, используя NumPy.

Сначала создайте многомерную матрицу (я изменил значения, чтобы было проще следить):

Time =        [  2,   1,   5,   4,   3]
Speed =       [ 10,  20,  40,  30,  50]
Brak_press =  [0.1, 0.3, 0.5, 0.4, 0.2]

data = np.array([Time, Speed, Brak_press]).transpose()

Итак, данныесохраняется как:

print(data)
# [[ 2.  10.   0.1]
#  [ 1.  20.   0.3]
#  [ 5.  40.   0.5]
#  [ 4.  30.   0.4]
#  [ 3.  50.   0.2]]

Чтобы извлечь скорость больше 20:

data[data[:,1] > 20]
# [[ 5.  40.   0.5]
#  [ 4.  30.   0.4]
#  [ 3.  50.   0.2]]

Чтобы получить наибольшее значение n Brak_press:

n = 2
data[data[:,2].argsort()[::-1][:n]]
# [[ 5.  40.   0.5]
#  [ 4.  30.   0.4]]
0 голосов
/ 08 февраля 2019

Вы почти у цели.Это должно делать то, что вы хотите:

speed_20 = np.where(Speed > 20)[0]
sort = np.argsort(-Brake[speed_20])
result = speed_20[sort[:N]]
...