猿问

与 axis=0 相比,np.argmin(arr, axis=1) 在 2D 和 3D 数组上

我知道如何np.argmin(arr, axis=0)运作。但np.argmin(arr, axis=1)让我很困惑。


示例1:

代码:


a2 = np.array([[1. , 2. , 3.3],

               [4. , 5. , 6.5]])


np.argmin(a2, axis=1)

输出:


array([0, 0], dtype=int64)

困惑:


我的困惑是,共有 2 个索引,总共 3 列。那为什么它的输出是(0,0)呢?它应该给出以下输出:


预期输出#1:


array([0], dtype=int64)

原因: 因为,它找到了“索引0”中最低的元素。


预期输出#2:


array([0, 0, 0], dtype=int64)

原因: 因为,在将索引 0 的元素与索引 1 的元素进行比较之后。应该说,每次我对这两个索引进行比较时,我都找到了索引 0 中的最低元素


示例2:

代码:


a5 = np.array([[[ 1,  2,  3,  4],

                [ 4,  5,  6,  7],

                [ 7,  8,  9, 10]],


               [[10, 11, 12, 13],

                [16, 17, 18, 19],

                [19, 20, 21, 22]]])


np.argmin(a5, axis=1)

输出:


array([[0, 0, 0, 0],

       [0, 0, 0, 0]], dtype=int64)

困惑: 现在为什么它在输出中给出 4 列和 2 行?


幕布斯7119047
浏览 113回答 2
2回答

慕村225694

无论轴号如何,np.min和的处理都是相同的。argmin0 并不意味着比 1 或 2 更特殊的东西。在所有情况下,指定的轴都会从结果中删除(与 相同np.sum)。让我们做一些更随机、更有趣的事情:In [216]: arr = np.arange(24)In [218]: np.random.shuffle(arr)In [219]: arrOut[219]: array([10,  2, 12, 11, 15,  8, 17, 20, 13, 21, 14,  1, 22,  7,  3,  5,  9,        0, 19, 16, 18,  6, 23,  4])In [220]: arr = arr.reshape(2,3,4)In [221]: arrOut[221]: array([[[10,  2, 12, 11],        [15,  8, 17, 20],        [13, 21, 14,  1]],       [[22,  7,  3,  5],        [ 9,  0, 19, 16],        [18,  6, 23,  4]]])使用axis=0,确定每个“行/列”元素的哪个“平面”具有最小值。In [222]: np.min(arr, axis=0)Out[222]: array([[10,  2,  3,  5],       [ 9,  0, 17, 16],       [13,  6, 14,  1]])In [223]: np.argmin(arr, axis=0)Out[223]: array([[0, 0, 1, 1],       [1, 1, 0, 1],       [0, 1, 0, 0]])argmin值是大小为 2 的维度的值索引值。10位于第一个平面, 位于3第二个平面,依此类推。对轴 2(行)做同样的事情:In [224]: np.min(arr, axis=2)Out[224]: array([[2, 8, 1],       [3, 0, 4]])In [225]: np.argmin(arr, axis=2)Out[225]: array([[1, 1, 3],       [2, 1, 3]])位于2第二列、1第四列等。使用它argmin来获取min值需要熟悉高级索引:In [226]: arr[[[0],[1]], [0,1,2], _225]     # Out[225] argminOut[226]: array([[2, 8, 1],       [3, 0, 4]])这里我使用 (2,1) 和 (3,) 数组(或可以制成数组的列表),它们将一起广播以匹配 (2,3) 索引argmin。他们一起从 (2,3,4) 形状中选取一个 (2,3) 值数组arr。一个新的功能take_along_axis应该会让应用更argmin容易。它有一个例子。此处应用:In [236]: idx = _225    In [237]: np.take_along_axis(arr, idx[...,None], axis=2)Out[237]: array([[[2],        [8],        [1]],       [[3],        [0],        [4]]])这是Out[224] np.min展开为 3d (2,3,1) 形状的数组。在显示中挑选出最少的元素可能会更容易Out[221]。In [238]: idx[...,None]Out[238]: array([[[1],        [1],        [3]],       [[2],        [1],        [3]]])

郎朗坤

看来我也无法完全理解这些符号,因为我总是发现自己将最后一个轴与最后一个轴之前的轴混淆了:2D模型(行-列)np.argmin不幸的是,不同轴的结果是:np.argmin(arr, axis=0)    np.argmin(arr, axis=1)         [0 0 1]                    [0 2]3D模型(水平-行-列)这也很接近:np.argmin(arr, axis=0)    np.argmin(arr, axis=1)    np.argmin(arr, axis=2)         [0 0]                      [0 1]                       [0 1]        [1 0]                      [1 1]                       [0 0]再说一次,除了axis=1与 交换之外,这工作得很好axis=2。我不知道这个神奇的交换从何而来,但希望这个图像有助于OP理解轴如何与维度联系起来。如果有人能评论为什么我需要特别应用规则,那就太好了Swap last two axes of your expected output。
随时随地看视频慕课网APP

相关分类

Python
我要回答