Как обнулить все значения матрицы (двумерный массив), кроме первых n значений, используя numpy? - PullRequest
0 голосов
/ 12 мая 2019

Предположим, у меня есть двумерный массив. Учитывая n, я хочу обнулить все элементы в матрице, кроме верхнего n.

Я пытался idx = (-y_pred).argsort(axis=-1)[:, :n] определить, каковы индексы самых больших значений n, но форма idx - это [H, W, n], и я не понимаю, почему.

Я пробовал -

sorted_list = sorted(y_pred, key=lambda x: x[0], reverse=True)
top_ten = sorted_list[:10]

Но на самом деле он не возвращал 10 лучших индексов.

Есть ли эффективный способ найти лучшие n индексов и обнулить остальные?

EDIT input - это матрица значений NxM, а output - это та же матрица размера NxM, что все значения равны 0, за исключением индексов, которые соответствуют 10 лучшим значениям

Ответы [ 2 ]

1 голос
/ 12 мая 2019

Следующий код обнулит матрицу NxM X.

threshold = np.sort(X.ravel())[-n]  # get the nth largest value
idx = X < threshold
X[idx] = 0

Примечание. Этот метод может возвращать матрицу, которая содержит более n ненулевых элементов при наличии дублированных значений.

1 голос
/ 12 мая 2019

Вот один из подходов, использующий numpy.argpartition(), основанный на идее Как получить индексы N максимальных значений в массиве NumPy?

# sample input to work with
In [62]: arr = np.random.randint(0, 30, 36).reshape(6, 6)

In [63]: arr
Out[63]: 
array([[ 8, 25, 12, 26, 21, 29],
       [24, 22,  7, 14, 23, 13],
       [ 1, 22, 18, 20, 10, 19],
       [26, 10, 27, 19,  6, 28],
       [17, 28,  9, 13, 11, 12],
       [18, 25, 15, 29, 25, 25]])


# initialize an array filled with zeros
In [59]: nullified_arr = np.zeros_like(arr)
In [64]: top_n = 10

# get top_n indices of `arr`
In [57]: top_n_idxs = np.argpartition(arr.reshape(-1), -top_n)[-top_n:]

# copy `top_n` values to output array
In [60]: nullified_arr.reshape(-1)[top_n_idxs] = arr.reshape(-1)[top_n_idxs]


In [71]: nullified_arr
Out[71]: 
array([[ 0, 25,  0, 26,  0, 29],
       [ 0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0],
       [26,  0, 27,  0,  0, 28],
       [ 0, 28,  0,  0,  0,  0],
       [ 0,  0,  0, 29, 25, 25]])
...