Как понять результат argmax (необычный массив) - PullRequest
1 голос
/ 28 марта 2020

Я столкнулся с проблемой, когда применял argmax к необычному трехмерному массиву, как в коде ниже:

import numpy as np
a = np.array([
    [
        [1, 5, 5, 2],
        [9, -6, 2, 8],
        [-3, 7, -9, 1]
    ],

    [
        [-1, 5, -5, 2],
        [9, 6, 2, 8],
        [3, 7, 9]
    ]
])
print('a, axis=0\n', np.argmax(a, axis=0))
print('a, axis=1\n', np.argmax(a, axis=1))
# print('a, axis=2\n', np.argmax(a, axis=2)) if this activated, Erros appears:numpy.AxisError: axis 2 is out of bounds for array of dimension 2.

b = np.array([
    [
        [1, 5, 5, 2],
        [9, -6, 2, 8],
        [-3, 7, -9, 1]
    ],

    [
        [-1, 5, -5, 2],
        [9, 6, 2, 8],
        [3, 7, 9, 9]
    ]
])
print('b, axis=0\n', np.argmax(b, axis=0))
print('b, axis=1\n', np.argmax(b, axis=1))
print('b, axis=2\n', np.argmax(b, axis=2))

Результаты:

a, axis=0

 [0 1 1]

a, axis=1

 [1 1]

b, axis=0

 [[0 0 0 0]

 [0 1 0 0]

 [1 0 1 1]]

b, axis=1

 [[1 2 0 1]

 [1 2 2 2]]

b, axis=2

 [[1 0 1]

 [1 0 2]]

Для результаты массива b, я полностью понимаю его правило вычисления, однако, что касается массива a, согласно ошибкам, насколько я понимаю, это не настоящий трехмерный массив, но почему функция может argmax все еще получите свой результат? И как функция получает свой результат?

1 Ответ

2 голосов
/ 28 марта 2020

B - это 3d-массив, который Argmax знает, как наивгать, и это нормально, но A отличается, так как A - это двумерный массив lists.

Когда вы говорите

print('a, axis=0\n', np.argmax(a, axis=0))

Argmax смотрит на ваш A как

[
[list11,list12,list13],
[list21,list22,list23]

]

, поэтому он пытается получить максимум из каждого из

max(list11, list21) , max(list12,list22) , max(list13, list23)

Проблема здесь заключается в том, что он опирается на операторы <,>,=, реализованные для списков, который реализован следующим образом:

Сравнение использует лексикографическое упорядочение: сначала сравниваются первые два элемента, и, если они различаются, это определяет результат сравнения; если они равны, сравниваются следующие два элемента и т. д., пока не будет исчерпана любая последовательность.

Пример

[1,2,3] > [2,3,1] # False
[1111,2,3] > [2,3,1] # True
[1,2,3] > [1,3,1] # False comparing second elements

Чтобы получить больше интуиции, давайте попробуем настройка массива A

a = np.array([ 
         [ 
             [1, 5, 5, 2], 
             [19, -6, 2, 18], 
             [-3, 7, -9, 1] 
         ], 

         [ 
             [-1, 5, -5, 2], 
             [9, 6, 2, 111118], 
             (-5555, 7, 9) 
         ] 
     ]) 
     print('a, axis=0\n', np.argmax(a, axis=0)) 

Это приведет к ошибке при попытке сравнить кортеж со списком, поскольку для такого сравнения не реализован оператор:

TypeError: '>' not supported between instances of 'tuple' and 'list'

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

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

Подробнее о перегрузке операторов читайте в python, вот базовый пример c, с которого можно начать: https://www.programiz.com/python-programming/operator-overloading

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...