Вернуть отсортированный индекс значений выше определенной вероятности в массиве - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть массив вероятностей, и я хочу сохранить только индекс значений выше 0,5, и отсортировать эти значения индекса по вероятности.

import numpy as np

arr = np.random.rand(10)
array([0.04620414, 0.0534432 , 0.04707483, 0.83529697, 0.24629344,
       0.58690842, 0.71345104, 0.02997366, 0.73212914, 0.99201534])

Из значений выше 0,5 я хочу отсортированные индексы, поэтому:

[9, 3, 8, 6, 5]

Я думаю, что это будет комбинация np.argwhere() и arr[arr > 0.5] и т. д.

Ответы [ 4 ]

1 голос
/ 01 апреля 2020
print (sorted([index for index in range(10) if arr[index] > 0.5], key=lambda index: arr[index]))

Это дает список python. Это работает, потому что [index for ... if arr[index] > 0.5] является списком, который возвращает индексы с их значениями> 0,5, а key определяет значение, по которому вы хотите сортировать (фактическое значение arr[index] вместо самого индекса)

Также после исследования некоторых numpy вещей, я думаю, что это будет работать также

import numpy as np

x = np.array([0.2, 0.8, 0.6])

print ([index for index in np.argsort(x) if index in np.where(x > 0.5)[0]]) # [2, 1]

Замените x вашим случайным массивом

И, наконец, я вас понимаю хотел убывать в порядке, в то время как оба моих кода в порядке возрастания хаха

1 голос
/ 01 апреля 2020

Это должно работать. В основном я выполняю np.where в уже отсортированном списке, для которого я помню порядок (спасибо argsort), и я повторно применяю этот порядок к найденным индексам, чтобы получить окончательный where_in_order, который является переменной, которую вы после.

import numpy as np

# arr = np.random.rand(10)
arr = np.array([0.04620414, 0.0534432 , 0.04707483, 0.83529697, 0.24629344,
       0.58690842, 0.71345104, 0.02997366, 0.73212914, 0.99201534])
print("original:")
print(arr)
print()

order = arr.argsort()
print("sorted:")
print(arr[order])
print()

print("where above 0.5 in increasing order:")
where_idx = np.where(arr[order] > 0.5)
print("found:")
print(arr[order][where_idx])
print()

print("found in order:")
where_in_order = order[where_idx]
print(arr[where_in_order])

print("decreasing order indices:")
print(list(reversed(where_in_order)))

выход

original:
[0.04620414 0.0534432  0.04707483 0.83529697 0.24629344 0.58690842
 0.71345104 0.02997366 0.73212914 0.99201534]

sorted:
[0.02997366 0.04620414 0.04707483 0.0534432  0.24629344 0.58690842
 0.71345104 0.73212914 0.83529697 0.99201534]

where above 0.5 in increasing order:
found:
[0.58690842 0.71345104 0.73212914 0.83529697 0.99201534]

found in order:
[0.58690842 0.71345104 0.73212914 0.83529697 0.99201534]
decreasing order indices:
[9, 3, 8, 6, 5]
0 голосов
/ 01 апреля 2020

Если вы используете список, вы можете фильтровать и сортировать его простым способом:

arr_filtered = filter(lambda x: x > 0.5, arr)
arr_filtered.sort()
print (arr_filtered)

Если вы хотите изменить порядок:

arr_filtered.sort(reverse=True)
0 голосов
/ 01 апреля 2020

Я думаю np.where - это именно то, что вы ищете:

np.where(arr>0.5)

Вывод:

(array([0, 2, 6]),)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...