Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何理解argmax(不常见数组)的结果_Python_Arrays_Numpy - Fatal编程技术网

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]
?这就是你所说的“不寻常”吗?