Итерация массива numpy для нахождения максимального значения в подмассиве, оставляющего индекс строки - PullRequest
1 голос
/ 19 марта 2019

Я хотел найти максимум двумерного массива вдоль оси = 0, и я не хочу включать значение в индекс строки. Я не доволен этим решением, потому что мне нужно запустить его на миллион строк, и я не хочу использовать цикл for здесь. Я попытался numpy.argmax , но он вычисляет максимальное значение строки, включая значение в индексе строки.

Мой 2D-массив

Arry=([[1,   0.5, 0.3,   0,    0.2],
       [0,   1,   0.2,   0.8,  0],
       [0,   1,   1,     0.3,  0],
       [0,   0,   0,     1,    0]])

Ожидаемый результат

[1, 3, 1]

Первая строка [1, 0,5, 0,3, 0, 0,2] имеет максимальное значение по индексу 1, то есть 0,5, поскольку значение 1 соответствует индексу строки 0, аналогично во втором ряду максимальное значение равно 0,8, то есть индекс 3 и 4-я строка не имеет максимального значения, так как все равны нулю

Мой код

import numpy as np

for idx,subarry in enumerate(Arry):
    newlist=np.delete(subarry, idx)
    idx_min=min(np.where(subarry==np.max(newlist))[0])
    if idx_min != 0: min_elem_idx.append(idx_min)

print(min_elem_idx)
[1, 3, 1]

Я ищу Pythonic способ достичь этого без использования цикла for

1 Ответ

2 голосов
/ 19 марта 2019

Это должно сделать трюк:

a = np.array([[1,   0.5, 0.3,   0,    0.2],
              [0,   1,   0.2,   0.8,  0],
              [0,   1,   1,     0.3,  0],
              [0,   0,   0,     1,    0]])

# Create an array of ones the same size as a
b = np.ones_like(a)

# Fill the diagonal of b with NaN
np.fill_diagonal(b, np.nan)

# Multiply the arrays in order to remove the index column from the max
c = a*b

# Find the index of the max value of every row (excluding the index value)
np.nanargmax(c, axis=1)

Вывод:

array([1, 3, 1, 0])

Для того, чтобы отфильтровать случаи, когда каждое значение равно нулю (и, следовательно, "не имеет максимума", как вы ее определили), вам придется проделать дополнительную работу.

...