Как найти те значения, которые являются самыми большими в их собственных строках и столбцах? - PullRequest
2 голосов
/ 12 мая 2019

Имеется случайная матрица 5х5 (двумерный массив).Пример:

[[66 27 52 63 15]
 [48 63 19 16  3]
 [35  9 45 45 88]
 [47 84 86 92 54]
 [89 79 76 49 67]]

Я хотел бы найти те значения, которые являются самыми большими в их собственных строках и столбцах, поэтому: 88,92,89

Я могу найти толькосамые большие значения в своих рядах.

import numpy as np
m = np.random.randint(0,100,(5,5))
print(m)
maxrows = list(map(max, m))
print(maxrows)

Ответы [ 3 ]

2 голосов
/ 13 мая 2019

Вот два теста, демонстрирующие, что все три ответа, приведенные до сих пор, являются неверными:

      TEST CASE 1                  TEST CASE 2
      ===========                  ===========

      [5 4 3 2 1]                  [0 1 2 3 4]
      [4 4 3 2 1]                  [1 2 3 4 5]
      [3 3 3 2 1]                  [2 3 4 5 6]
      [2 2 2 2 1]                  [3 4 5 6 7]
      [1 1 1 1 1]                  [4 5 6 7 8]

correct
answer 1,2,3,4,5                    8                           

me     5,4,3,2,1    : correct   --  4,5,6,7,8    : wrong   
kk     3,4,5        : wrong     --  8,6,7        : wrong   
yt     5            : wrong     --  8            : correct 

Скрипт для выдачи вышеуказанного вывода (содержащий правильное решение pp1 / arg_pp1):

import numpy as np

def arg_pp1(a):
    return np.where((a==a.max(0, keepdims=True))
                    & (a==a.max(1, keepdims=True)))

def pp1(a):
    return np.array(sorted(set(a[arg_pp1(a)])))

def me(a):
    rmax = [max(row) for row in a]  # max in rows
    cmax = [max(column) for column in a.T]  # max in columns
    return [x for x in rmax if x in cmax]  # intersections

def kk(a):
    maxrows = list(map(max, a))
    a_90 = np.rot90(a, axes=(1,0))
    maxcols=list(map(max, a_90))
    maxcols=maxcols[::-1]
    return list(set([max(pair) for pair in zip(maxrows, maxcols)]))

def yt(a):
    row_maxs = a.argmax(1)
    maxs = a[np.arange(a.shape[0]), row_maxs] 
    reordered_col_maxs = a[:,row_maxs].max(0)
    return maxs[maxs == reordered_col_maxs]

e1 = np.minimum(*np.ogrid[5:0:-1,5:0:-1])
e2 = sum(np.ogrid[:5,:5])
print("      TEST CASE 1                  TEST CASE 2")
print("      ===========                  ===========")
print()
for r1, r2 in zip(e1, e2):
    print(f"      {r1}                  {r2}")
print()
print("correct")
print("answer", *(f'{",".join(map(str, pp1(a))):28s}' for a in (e1, e2)))
print()
for sol in me, kk, yt:
    print(sol.__name__, '   ', '  --  '.join(
        f'{",".join(map(str, sol(a))):12s} : '
        f'{("wrong  ", "correct")[set(sol(a))==set(pp1(a))]:8s}'
        for a in (e1,e2)))
1 голос
/ 12 мая 2019

попробуйте это:

import numpy as np
m = np.random.randint(0,100,(5,5))
print(m)

rmax = [max(row) for row in m]  # max in rows
cmax = [max(column) for column in m.T]  # max in columns
result = [x for x in rmax if x in cmax]  # intersections

print(result)

вывод:

[[ 9 35 89 83 45]
 [10 10 84 69 58]
 [75 69 45 97 84]
 [50  4 96 24 56]
 [62 52 71 43  7]]

[84, 97, 96]
0 голосов
/ 12 мая 2019

Попробуйте, я думаю, это должно работать:

m = np.array([[66, 27, 52, 63, 15],
 [48, 63, 19, 16,  3],
 [35,  9, 45, 45, 88],
 [47, 84, 86, 92, 54],
 [89, 79, 76, 49, 67]])

maxrows = list(map(max, m))

Повернуть матрицу:

m_90=np.rot90(m, axes=(1,0))

array([[89, 47, 35, 48, 66],
       [79, 84,  9, 63, 27],
       [76, 86, 45, 19, 52],
       [49, 92, 45, 16, 63],
       [67, 54, 88,  3, 15]])
maxcols=list(map(max, m_90))

maxcols=maxcols[::-1]

Результат:

list(set([max(pair) for pair in zip(maxrows, maxcols)]))
[88, 89, 92]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...