Сделайте все нули Elemant кроме элемента max n в каждой строке в numpy 2d-массиве - PullRequest
1 голос
/ 27 мая 2019

Допустим, у меня есть массив 2D numpy, например:

[[1, 8, 3, 4, 5],
 [10,13,13,12,15]]

Я хочу преобразовать все элементы в ноль, кроме максимального или максимального 2 элементов в каждой строке. Вывод, который я хотел бы получить:

[[0, 8, 0,0, 5],
 [0,13,13,0,15]]

Как я могу это сделать?

Ответы [ 4 ]

0 голосов
/ 27 мая 2019

Этот код предназначен только для определения максимума в строке и замены всех других значений на ноль. Если вы хотите включить 2 верхних значения, я думаю, вам нужно написать для цикла.

   import numpy as np
   import copy

   a = np.array([[1, 8, 3, 4, 5],
     [10,13,13,12,15]])

   b = copy.deepcopy(a)

a == np.max (a) вызовет ошибку в будущем, так что вот измененная версия, которая будет продолжать вещать правильно.

# get max by row and convert from (n, ) -> (n, 1) which will broadcast
row_maxes = a.max(axis=1).reshape(-1, 1)

если обновление должно быть на месте, вы можете сделать

a[:] = np.where(a == row_maxes, row_maxes, 0)

>> a
 array([[ 0,  8,  0,  0,  0],
           [ 0,  0,  0,  0, 15]])

Вы можете определить максимум 2 из каждой строки и подать заявку на цикл, чтобы получить желаемый результат.

b = np.sort(b)
max_two = np.array(list(map(lambda row : row[-2:], b)))

for i, row in enumerate(a):
   for j, elm in enumerate(row):
      if elm not in max_two:
         a[i][j] = 0

>> a
array([[ 0,  8,  0,  0,  5],
       [ 0,  13,  13,  0, 15]])
0 голосов
/ 27 мая 2019

Для решения этой проблемы нам нужно отсортировать ваши данные.Если x - это ваш массив данных массива, сначала мы его сортируем.

import numpy as np
x = np.array([[1,8,3,4,5],[10,13,13,12,15]])
x.sort()

После сортировки только два конечных элемента каждой строки показывают максимальные значения.Таким образом, мы обнуляем нулевое значение для других элементов и сохраняем x в f.

for i in range(0,len(x)):
    x[i][0:-2]=0
f = x

Тогда f равно:

array([[ 0,  0,  0,  5,  8],
       [ 0,  0,  0, 13, 15]])

Теперь нам нужно начать x и f:

x = np.array([[1,8,3,4,5],[10,13,13,12,15]])

x - это:

array([[ 0,  8,  0,  0,  5],
       [ 0, 13, 13,  0, 15]])

Наконец, мы сравним x и f для достижения нашей цели:

for i in range(0,len(f)):
    for j in range(0,len(f[i])):
        if x[i][j] not in f[i]:
            x[i][j]=0

RESULT для x будет выглядеть так:

array([[ 0,  8,  0,  0,  5],
       [ 0, 13, 13,  0, 15]])
0 голосов
/ 27 мая 2019
def func(x):
    x[np.argwhere(x != x.max())] = 0
    return x

arr = np.array([[1, 8, 3, 4, 5],
               [10,13,13,12,15]])

new_arr = np.apply_along_axis(func,  1, arr)

Вы можете изменить функцию "func" для 2 больших чисел. Приведенный выше фрагмент заменяет все элементы на 0, кроме самого большого в каждой строке.

Обновление: чтобы сделать это с самыми большими n элементами, вы можете использовать следующую функцию в

n = 2
def func(x):
    global n
    idx = (-x).argsort()[n:]
    x[idx] = 0
    return x

arr = np.array([[1, 8, 3, 4, 5],
               [10,13,13,12,15]])

new_arr = np.apply_along_axis(func,  1, arr)
0 голосов
/ 27 мая 2019

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

np.where(condition, data, 0)  
...