web-dev-qa-db-ja.com

NumPyの軸パラメーターはどのように機能しますか?

誰かがNumPyのaxisパラメータの機能を正確に説明できますか?

私はひどく混乱しています。

関数myArray.sum(axis=num)を使用しようとしています

最初は、配列自体が3次元かどうかを考えましたが、axis=0は、同じ位置にあるすべてのネストされたアイテムの合計で構成される3つの要素を返します。各次元に5つの次元が含まれている場合、axis=1は5つのアイテムの結果を返します。

しかし、これはそうではなく、ドキュメントは私を助けるのに良い仕事をしていません (彼らは3x3x3配列を使用しているので、何が起こっているのかを知るのは難しいです)

これが私がしたことです:

>>> e
array([[[1, 0],
        [0, 0]],

       [[1, 1],
        [1, 0]],

       [[1, 0],
        [0, 1]]])
>>> e.sum(axis = 0)
array([[3, 1],
       [1, 1]])
>>> e.sum(axis=1)
array([[1, 0],
       [2, 1],
       [1, 1]])
>>> e.sum(axis=2)
array([[1, 0],
       [2, 1],
       [1, 1]])
>>>

明らかに結果は直感的ではありません。

34
CodyBugstein

明らかに、

e.shape == (3, 2, 2)

軸上の合計は縮小操作であるため、指定された軸は非表示になります。したがって、

e.sum(axis=0).shape == (2, 2)
e.sum(axis=1).shape == (3, 2)
e.sum(axis=2).shape == (3, 2)
23
Martin

Numpyで軸が何を意味するかを理解する:

3次元のx、y、z座標平面を考えます。

enter image description here

軸パラメーターは、集約関数を動作させたい次元に沿ってnumpy配列と通信する数値です。

Python numpy/pandas軸ニーモニック:

axis=0 means 'along the row', (x in the above image)
axis=1 means 'along the column', (y in the above image)
axis=2 means 'along the depth', (z in the above image)

enter image description here

画像ソース: https://github.com/sentientmachine/Cheatsheets#python_numpy

Numpyベクトル化を具体的に理解し、ブロードキャストの次元操作の順序を理解するには、軸パラメーターを理解することが必要です。

3次元の行列を合計したいとします。合計は、x、y、z軸、または3つすべてに沿って機能します。デフォルトの軸は0で、これは最も外側の次元を意味し、最も外側の次元はyour_3d_matrix[0]によって返される次元です

したがって、axis = 0、axis = 1、またはaxis = 2に沿って合計すると、その次元全体で1次元の合計スライスを受け取ります。

例:

a = np.array([[1,2],[3,4]])   #define a simple 2d ndarray

>>> a[0,0]
1
>>> a[0,1]
2
>>> a[1,0]
3
>>> a[1,1]
4


>>> a.sum()                   #axis not specified means first along the col then 
10                            #along the row: (1+3) = 4 and
                              #2+4 = 6 then along the column 4+6 = 10

>>> a.sum(axis=0)             #forcing axis=0 says collapse along the row so:
array([4, 6])                 #1+3 = 4,   2+4 = 6

>>> a.sum(axis=1)             #forcing axis=1 says collapse along the col so:
array([3, 7])                 #1+2 = 3,   3+4 = 7

2番目の次元であるaxis = 2を使用することもできます:

>>> b = np.array([[[1,2],[3,4]], [[5,6],[7,8]]])
>>> b
array([[[1, 2],
        [3, 4]],

       [[5, 6],
        [7, 8]]])
>>> b.sum()         #sum along depth, col, then row:
36
>>> b.sum(axis=0)   #sum across the topmost dimension 0, the two groups of 4
array([[ 6,  8],
       [10, 12]])
>>> b.sum(axis=1)   #sum across dimension 1 the lists of two, added.
array([[ 4,  6],
       [12, 14]])
>>> b.sum(axis=2)   #sum across the dimension 2, each individual list, row wise. 
array([[ 3,  7],
       [11, 15]])

軸の方向は、適用される構造によって異なります。

軸の折りたたみの操作順序は、最も外側のyourarray[0]から最も内側の次元のyourarray[0][0][0]までです。

この派手なソフトウェアをコード化した開発者でさえ、線形代数を制御する行列演算の直感を作成するのに問題があります。Youtubeビデオは、軸パラメーターを詳細に説明しようとします:

軸パラメーターをカバーするAlexandre Chabot LeClerc NumPyチュートリアル: https://youtu.be/gtejJ3RCddE?t=1h55m17s

YouTubeのデータスクールチャネルには、軸パラメーターの優れた説明があります。 https://youtu.be/PtO3t6ynH-8?t=5m1s

36
Eric Leschinski

axisを直感的に理解するには、以下の図を参照してください(ソース: Physics Dept、Cornell Uni

enter image description here

上の図の(ブール)配列のshapeshape=(8, 3)です。 ndarray.shapeは、エントリが長さに対応するTupleを返します特定の次元の。この例では、8軸0の長さに対応しますが、3は、軸1の長さに対応します。

12
kmario23

誰かがこの視覚的な説明を必要とする場合:

numpy axis

6
debaonline4u

一部の回答は具体的すぎるか、混乱の主な原因に対応していません。この回答は、簡単な例を使用して、概念のより一般的で単純な説明を提供しようとしています。

混乱の主な原因は、「平均が計算される軸」などの式に関連しています。これは、_numpy.mean_関数の引数axisの説明です。ここで「それに沿って」とは一体何を意味するのでしょうか。 「に沿って」とは、軸が0の場合、行を合計し(および平均を計算している場合は行の数で除算し)、軸が1の場合は列を意味します。 axisが0(または1)の場合、行はスカラーまたはベクトル、あるいは他の多次元配列にすることができます。

_In [1]: import numpy as np

In [2]: a=np.array([[1, 2], [3, 4]])

In [3]: a
Out[3]: 
array([[1, 2],
       [3, 4]])

In [4]: np.mean(a, axis=0)
Out[4]: array([2., 3.])

In [5]: np.mean(a, axis=1)
Out[5]: array([1.5, 3.5])
_

したがって、上記の例では、_(1 + 3)/2 = 2_および_(2 + 4)/2 = 3_であるため、np.mean(a, axis=0)array([2., 3.])を返します。各列の行の平均を返すため(2つの列があるため)、2つの数値の配列が返されます。

1
nbro

視覚化には良い答えがありますが、純粋に分析的な観点から考えると役立つ場合があります。

Numpyで任意の次元の配列を作成できます。たとえば、これは5次元配列です。

>>> a = np.random.Rand(2, 3, 4, 5, 6)
>>> a.shape
(2, 3, 4, 5, 6)

インデックスを指定することにより、この配列の任意の要素にアクセスできます。たとえば、この配列の最初の要素は次のとおりです。

>>> a[0, 0, 0, 0, 0]
0.0038908603263844155

次元の1つを取り出すと、その次元の要素の数が得られます。

>>> a[0, 0, :, 0, 0]
array([0.00389086, 0.27394775, 0.26565889, 0.62125279])

sumのような関数をaxisパラメータとともに適用すると、その次元が削除され、元の次元よりも小さい次元の配列が作成されます。新しい配列のセルごとに、オペレーターは要素のリストを取得し、縮約関数を適用してスケーラーを取得します。

>>> np.sum(a, axis=2).shape
(2, 3, 5, 6)

これで、この配列の最初の要素が上記の要素の合計であることを確認できます。

>>> np.sum(a, axis=2)[0, 0, 0, 0]
1.1647502999560164

>>> a[0, 0, :, 0, 0].sum()
1.1647502999560164

axis=Noneは、配列を平坦化し、すべての数値に関数を適用するという特別な意味があります。

これで、軸が数値だけでなくタプルである、より複雑なケースについて考えることができます。

>>> np.sum(a, axis=(2,3)).shape
(2, 3, 6)

同じ手法を使用して、この削減がどのように行われたかを把握していることに注意してください。

>>> np.sum(a, axis=(2,3))[0,0,0]
7.889432081931909

>>> a[0, 0, :, :, 0].sum()
7.88943208193191

reduceディメンションの代わりに、配列のaddingディメンションに同じ推論を使用することもできます。

>>> x = np.random.Rand(3, 4)
>>> y = np.random.Rand(3, 4)

# New dimension is created on specified axis
>>> np.stack([x, y], axis=2).shape
(3, 4, 2)
>>> np.stack([x, y], axis=0).shape
(2, 3, 4)

# To retrieve item i in stack set i in that axis 

これにより、この重要なパラメータの一般的で完全な理解が得られることを願っています。

0
Shital Shah