Python 如何理解argmax(不常见数组)的结果
我在一个不常见的三维数组上应用Python 如何理解argmax(不常见数组)的结果,python,arrays,numpy,Python,Arrays,Numpy,我在一个不常见的三维数组上应用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\
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,轴=0
[0 1 1]
a、 轴=1
[1 1]
b、 轴=0
[[0 0 0 0]
[0 1 0 0]
[1 0 1 1]]
b、 轴=1
[[1 2 0 1]
[1 2 2 2]]
b、 轴=2
[[1 0 1]
[1 0 2]]
对于数组
b
的结果,我完全理解它的计算规则,但是对于数组a
,根据错误,就我而言,它不是一个真正的3D数组,但是为什么函数argmax
仍然可以得到它的结果呢?函数是如何得到结果的呢?B
是一个3d数组,Argmax知道如何naivgate,这没关系,但是a
不同于列表的2d数组
当你说
print('a, axis=0\n', np.argmax(a, axis=0))
Argmax将您的A
视为
[
[list11,list12,list13],
[list21,list22,list23]
]
因此,它试图做的是最大限度地利用每一个
max(列表11、列表21)、max(列表12、列表22)、max(列表13、列表23)
这里的问题是它依赖于为列表实现的,=
运算符,其实现如下
比较使用字典顺序:前两种
对项目进行比较,如果项目不同,则确定结果
比较;如果它们相等,则比较下两项,
依此类推,直到其中一个序列用尽
范例
[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中运算符重载的更多信息,下面是一个基本示例:
您是否尝试过打印a
?它可能会提示您出了什么问题。a
是一个2d对象数据类型数组,包含列表。max/argmax
函数通过对元素应用
比较来处理对象数据类型。因此,这取决于对象本身是如何实现的,alist1
。a
和b
之间的唯一区别是b
具有[3,7,9,9]
其中a
具有[3,7,9]
?这就是你所说的“不寻常”吗?