web-dev-qa-db-ja.com

numpy:argmin()およびargmax()関数のロジックは何ですか?

Axisパラメーターで使用した場合、argmaxおよびargminの出力を理解できません。例えば:

_>>> a = np.array([[1,2,4,7], [9,88,6,45], [9,76,3,4]])
>>> a
array([[ 1,  2,  4,  7],
       [ 9, 88,  6, 45],
       [ 9, 76,  3,  4]])
>>> a.shape
(3, 4)
>>> a.size
12
>>> np.argmax(a)
5
>>> np.argmax(a,axis=0)
array([1, 1, 1, 1])
>>> np.argmax(a,axis=1)
array([3, 1, 1])
>>> np.argmin(a)
0
>>> np.argmin(a,axis=0)
array([0, 0, 2, 2])
>>> np.argmin(a,axis=1)
array([0, 2, 2])
_

ご覧のとおり、最大値はポイント(1,1)で、最小値はポイント(0,0)です。だから私が実行したときの私のロジックでは:

  • np.argmin(a,axis=0)期待していたarray([0,0,0,0])
  • np.argmin(a,axis=1)期待していたarray([0,0,0])
  • np.argmax(a,axis=0)期待していたarray([1,1,1,1])
  • np.argmax(a,axis=1)期待していたarray([1,1,1])

物事に対する私の理解の何が問題になっていますか?

28
user4584333

axis引数を追加することにより、NumPyは行と列を個別に調べます。指定されていない場合、配列aは単一の1D配列にフラット化されます。

_axis=0_は、操作が実行されることを意味しますdown 2D配列の列aが順番に実行されます。

たとえば、np.argmin(a, axis=0)は、4つの列のそれぞれの最小値のインデックスを返します。各列の最小値は、下のboldに示されています。

_>>> a
array([[ 1,  2,  4,  7],  # 0
       [ 9, 88,  6, 45],  # 1
       [ 9, 76,  3,  4]]) # 2

>>> np.argmin(a, axis=0)
array([0, 0, 2, 2])
_

一方、_axis=1_は、操作が実行されることを意味しますacrossaの行。

つまり、aには3つの行があるため、np.argmin(a, axis=1)は_[0, 2, 2]_を返します。最初の行の最小値のインデックスは0、2番目と3番目の行の最小値のインデックスは2です。

_>>> a
#        0   1   2   3
array([[ 1,  2,  4,  7],
       [ 9, 88,  6, 45],
       [ 9, 76,  3,  4]])

>>> np.argmin(a, axis=1)
array([0, 2, 2])
_
45
Alex Riley

np.argmax関数は、軸を指定しない限り、デフォルトで 平坦化された配列に沿って 動作します。何が起こっているのかを確認するには、flattenを明示的に使用できます。

np.argmax(a)
>>> 5

a.flatten()
>>>> array([ 1,  2,  4,  7,  9, 88,  6, 45,  9, 76,  3,  4])
             0   1   2   3   4   5 

わかりやすくするために、上記の配列の下のインデックスに番号を付けました。インデックスは、numpyのゼロから番号付けされることに注意してください。

軸を指定する場合、期待どおりに機能します:

np.argmax(a,axis=0)
>>> array([1, 1, 1, 1])

これは、1(下)に沿った各列について、最大値が行axis=0(2番目の値)にあることを示しています。データを少し変更すると、これをより明確に確認できます。

a=np.array([[100,2,4,7],[9,88,6,45],[9,76,3,100]])
a
>>> array([[100,   2,   4,   7],
           [  9,  88,   6,  45],
           [  9,  76,   3, 100]])

np.argmax(a, axis=0)
>>> array([0, 1, 1, 2])

ご覧のとおり、列1の行0、列2および3の行1、列4の行3の最大値を識別します。

documentationnumpyインデックス作成の便利なガイドがあります。

5
mfitzp

補足事項として、完全な配列で最大値の座標を検索する場合は、次を使用できます。

a=np.array([[1,2,4,7],[9,88,6,45],[9,76,3,4]])
>>> a
[[ 1  2  4  7]
 [ 9 88  6 45]
 [ 9 76  3  4]]

c=(np.argmax(a)/len(a[0]),np.argmax(a)%len(a[0]))
>>> c
(1, 1)
4
""" ....READ THE COMMENTS FOR CLARIFICATION....."""

import numpy as np
a = np.array([[1,2,4,7], [9,88,6,45], [9,76,3,4]])

"""np.argmax(a) will give index of max value in flatted array of given matrix """
>>np.arg(max)
5

"""np.argmax(a,axis=0) will return list of indexes of  max value column-wise"""
>>print(np.argmax(a,axis=0))
[1,1,1,1]

"""np.argmax(a,axis=1) will return list of indexes of  max value row-wise"""
>>print(np.argmax(a,axis=1))
[3,1,1]

"""np.argmin(a) will give index of min value in flatted array of given matrix """
>>np.arg(min)
0

"""np.argmin(a,axis=0) will return list of indexes of  min value column-wise"""
>>print(np.argmin(a,axis=0))
[0,0,2,2]

"""np.argmin(a,axis=0) will return list of indexes of  min value row-wise"""
>>print(np.argmin(a,axis=1))
[0,2,2]
3
Nitin Ashutosh

Argmax関数の引数の軸は、配列がスライスされる軸を指します。

別の言葉では、np.argmin(a,axis=0)np.apply_along_axis(np.argmin, 0, a)と実質的に同じです。つまり、軸= 0に沿ったこれらのスライスされたベクトルの最小位置を見つけます。

したがって、あなたの例では、np.argmin(a, axis=0)[0, 0, 2, 2]であり、それぞれの列の[1, 2, 3, 4]の値に対応します

0
xingzhi.sg