Gibt es eine Möglichkeit, np.min zu verwenden, um mehr als 1 Mindestanzahl von Matrix zu erhalten?Erhalten von 3 Mindestnummern von np.min (Array)
x = np.array([[1,2,3],[4,5,6],[7,8,0]])
Erwartetes Ergebnis für 3 Mindestzahlen
>>[0,1,2]
Gibt es eine Möglichkeit, np.min zu verwenden, um mehr als 1 Mindestanzahl von Matrix zu erhalten?Erhalten von 3 Mindestnummern von np.min (Array)
x = np.array([[1,2,3],[4,5,6],[7,8,0]])
Erwartetes Ergebnis für 3 Mindestzahlen
>>[0,1,2]
Flatten und sortiere das Array und erhalte die ersten 3 Elemente.
sorted(x.flatten())[:3]
Out[275]: [0, 1, 2]
Oder ein schneller Ansatz:
sorted(sum(x.tolist(),[]))[:3]
%timeit sorted(sum(x.tolist(),[]))[:3]
The slowest run took 7.38 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 2.14 µs per loop
%timeit sorted(x.flatten())[:3]
The slowest run took 11.54 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 4.97 µs per loop
Eine Möglichkeit argsort
auf werden abgeflacht Ansicht zu verwenden wäre -
x.ravel()[x.ravel().argsort()[:3]]
performanter ein mit np.argpartition
-
x.ravel()[x.ravel().argpartition(range(3))[:3]]
Oder mit sort
es danach zu sortieren -
np.sort(x.ravel()[x.ravel().argpartition(3)[:3]])
Wenn Sie die Zahlen nicht egal, überspringen sort
sortiert werden -
x.ravel()[x.ravel().argpartition(3)[:3]]
Probelauf -
In [44]: x
Out[44]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 0]])
In [45]: x.ravel()[x.ravel().argsort()[:3]]
Out[45]: array([0, 1, 2])
In [48]: x.ravel()[x.ravel().argpartition(range(3))[:3]]
Out[48]: array([0, 1, 2])
In [52]: np.sort(x.ravel()[x.ravel().argpartition(3)[:3]])
Out[52]: array([0, 1, 2])
In [47]: x.ravel()[x.ravel().argpartition(3)[:3]]
Out[47]: array([0, 1, 2])
'argpartition' ist der Weg zu gehen. Sein * O (log n) * wo 'argsort' ist * O (n log n) * – piRSquared