Ваш preds[0]
, присвоенный имени переменной, является трехмерным массивом:
In [449]: preds0 = np.array([[[ 0., 7., 0.3361728, 0.2269333
...: , 0.6589312,0.70067763, 0.8960621 ],[ 0., 15., 0.4
...: 4955394, 0.5509065, 0.4315516,0.6530549, 0.7223625 ]]])
In [450]: preds0.shape
Out[450]: (1, 2, 7)
argsort
применяется к массиву одинаковой формы:
In [451]: np.argsort(preds0)
Out[451]:
array([[[0, 3, 2, 4, 5, 6, 1],
[0, 4, 2, 3, 5, 6, 1]]])
In [452]: _.shape
Out[452]: (1, 2, 7)
При этом исходном измерении размера 1 не имеет значения величина реверса или среза в этом измерении. Я подозреваю, что вы хотели повернуть вспять и нарезать последнее измерение, размер 7. НО, будь осторожен с этим. Argsort многомерного массива, даже если он применяется к одному измерению (последнее по умолчанию), трудно понять и использовать.
Форма соответствует массиву, но значения - диапазон 0-6, последнее измерение. numpy 1.15 добавил пару функций, чтобы упростить использование результата argsort
(и некоторых других функций):
In [455]: np.take_along_axis(preds0, Out[451], axis=-1)
Out[455]:
array([[[ 0. , 0.2269333 , 0.3361728 , 0.6589312 ,
0.70067763, 0.8960621 , 7. ],
[ 0. , 0.4315516 , 0.44955394, 0.5509065 ,
0.6530549 , 0.7223625 , 15. ]]])
Обратите внимание, что строки теперь отсортированы, так же как и в np.sort(preds0, axis=-1)
.
Я мог бы выбрать одну «строку» массива индекса:
In [459]: idxs = Out[451]
In [461]: idx = idxs[0,0]
In [462]: idx
Out[462]: array([0, 3, 2, 4, 5, 6, 1])
In [463]: idx[::-1] # reverse
Out[463]: array([1, 6, 5, 4, 2, 3, 0])
In [464]: idx[::-1][:5] # select
Out[464]: array([1, 6, 5, 4, 2])
In [465]: preds0[0,0,Out[464]]
Out[465]: array([7. , 0.8960621 , 0.70067763, 0.6589312 , 0.3361728 ])
Теперь у меня есть пять самых больших значений preds0[0,0,:]
в обратном порядке.
И сделать это для всего preds0
массива:
np.take_along_axis(preds0, idxs[:,:,::-1][:,:,:5], axis=-1)
или для более ранних версий:
preds0[[0], [[0],[1]], idxs[:,:,::-1][:,:,:5]]