私はPythonを学んでいて、_numpy.sum
_に遭遇しました。オプションのパラメーターaxis
があります。このパラメーターは、列ごとの合計または行ごとの合計を取得するために使用されます。 _axis = 0
_の場合、列のみを合計することを意味します。例えば、
_a = np.array([[1, 2, 3], [4, 5, 6]])
np.sum(a, axis = 0)
_
このコードスニペットは、出力を生成します:array([5, 7, 9])
、結構です。しかし、私がするなら:
_a = np.array([1, 2, 3])
np.sum(a, axis = 0)
_
私は結果を得る:_6
_、それはなぜですか? array([1, 2, 3])
を取得すべきではありませんか?
何が起こっているのかというと、numpyは最初の(0番目の)軸だけを合計しています。以下を検討してください。
In [2]: a = np.array([1, 2, 3])
In [3]: a.shape
Out[3]: (3,)
In [4]: len(a.shape) # number of dimensions
Out[4]: 1
In [5]: a1 = a.reshape(3,1)
In [6]: a2 = a.reshape(1,3)
In [7]: a1
Out[7]:
array([[1],
[2],
[3]])
In [8]: a2
Out[8]: array([[1, 2, 3]])
In [9]: a1.sum(axis=1)
Out[9]: array([1, 2, 3])
In [10]: a1.sum(axis=0)
Out[10]: array([6])
In [11]: a2.sum(axis=1)
Out[11]: array([6])
In [12]: a2.sum(axis=0)
Out[12]: array([1, 2, 3])
したがって、より明確にするために:
In [15]: a1.shape
Out[15]: (3, 1)
a1
は2次元で、「長」軸が最初です。
In [16]: a1[:,0] # give me everything in the first axis, and the first part of the second
Out[16]: array([1, 2, 3])
次に、最初の軸に沿って合計します。
In [17]: a1.sum(axis=0)
Out[17]: array([6])
ここで、それほど重要ではない2次元のケースを考えます。
In [20]: b = np.array([[1,2,3],[4,5,6]])
In [21]: b
Out[21]:
array([[1, 2, 3],
[4, 5, 6]])
In [22]: b.shape
Out[22]: (2, 3)
最初の軸は「行」です。合計に沿って行:
In [23]: b.sum(axis=0)
Out[23]: array([5, 7, 9])
2番目の軸は「列」です。合計に沿って列:
In [24]: b.sum(axis=1)
Out[24]: array([ 6, 15])
np.sum(a, axis=i)
の軸iは、その配列の形状のi番目のインデックスです(ゼロから始まる)。
いくつかの例でそれが何を意味するかを試して理解してみましょう:
_a = np.array([1, 2, 3])
print (a.shape) #prints (3,)
#so axis = 0 corresponds to 3 and axis = 1 corresponds to nothing
_
Axis = 0とaxis = 1が合計に対して何をするか見てみましょう:
_sum = np.sum(a, axis=0) #sum = 6
_
したがって、sum = np.sum(a, axis=0)
は、a.shapeの0番目のインデックスが参照するすべての数値を合計します。この場合、3つの数値です。 numpy配列はデフォルトで行優先(これは、行インデックスが列インデックスの前に指定されているという別の言い方です)なので、axis = 0は、形状が参照する3つの数値を合計します。
_sum = np.sum(a, axis=1) #gives an error
_
同様に、np.sum(a, axis=1)
はnp.shapeの最初のインデックスが参照するすべての数値を合計する必要がありますが、形状の最初のインデックスがないため、エラーが発生します。
別の例を見てみましょう:
_b = np.array([[1,2,3],
[4,5,6]])
print(b.shape) #prints (2,3)
#axis = 0 corresponds to 2 and axis = 1 corresponds to 3
_
次に、軸を変更するとどうなるかを見てみましょう。
_sum = np.sum(b, axis=0) #sum = [5, 7, 9] of shape(3,)
_
Axis = 0は形状の最初のインデックスに沿って合計する必要があることを知っており、(形状を見ることにより)この軸に沿って2つの数値を見つけることが期待されます。つまり_[1+4, 2+5, 3+6]
_です。
_sum = np.sum(b, axis=1) #sum = [6, 15] of shape(2,)
_
これで合計は軸= 1に沿っており、形状からわかるように、これは合計される3つの数値がある軸です。したがって、[1 + 2 + 3,4 + 5 + 6]
axis
は、配列インデックスのインデックスです。配列のインデックスは0から始まり、右から左に数えます。
したがって、np.sum(a, axis = 0)
は、右端のインデックスに沿った合計を意味します。