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