Mam tablicę prawdopodobieństw i chcę zachować tylko indeks wartości powyżej 0,5 i posortować te wartości indeksu zgodnie z prawdopodobieństwem.

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])

Z wartości powyżej 0,5 chcę posortowane indeksy, więc:

[9, 3, 8, 6, 5]

Myślę, że będzie to kombinacja np.argwhere() i arr[arr > 0.5] i tak dalej.

0
Nicolas Gervais 1 kwiecień 2020, 16:44

4 odpowiedzi

Najlepsza odpowiedź
print (sorted([index for index in range(10) if arr[index] > 0.5], key=lambda index: arr[index]))

To daje listę Pythona. To działa, ponieważ [index for ... if arr[index] > 0.5] jest listą, która zwraca indeksy, których wartościami są & gt; 0.5, a key definiuje wartość, na podstawie której chcesz sortować (rzeczywista wartość arr[index] zamiast samego indeksu)

Myślę, że po przeprowadzeniu badań nad niektórymi odrętwiałymi rzeczami, to również zadziała

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]

Zastąp x swoją losową tablicą

I w końcu zdaję sobie sprawę, że chciałeś malejąco, podczas gdy oba moje kody są w porządku rosnącym haha

1
Gareth Ma 1 kwiecień 2020, 14:05

To powinno działać. Zasadniczo wykonuję np.where na już posortowanej liście, dla której pamiętam kolejność (dzięki argsort) i ponownie stosuję tę kolejność do znalezionych indeksów, aby uzyskać ostateczny where_in_order która jest zmienną, której szukasz.

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)))

Plony

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]
1
smarie 1 kwiecień 2020, 14:22

Myślę, że np.where jest właśnie tym szukasz:

np.where(arr>0.5)

Wynik:

(array([0, 2, 6]),)
0
Adam.Er8 1 kwiecień 2020, 13:46

Jeśli korzystasz z listy, możesz filtrować i sortować w prosty sposób:

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

Jeśli chcesz odwrócić kolejność:

arr_filtered.sort(reverse=True)
0
m8factorial 1 kwiecień 2020, 13:59