2017-06-12 9 views
1

私はPythonとnumpyの初心者ですので、サンプルコードを実行して理解のために修正しようとしています。 numpy.sumについてのコードがありましたが、axisというパラメータがありましたが、実行できませんでした。いつか(scipyドキュメントを読んで、実験をしようとした)、axis = 1の代わりにaxis = (1,2,3)を使って実行しました。Python numpy sum軸の動作を伴う関数

事はどこでも私が検索すると、彼らは仕事を得るためにのみaxis = 1を書く。

私はPython 3.5.3を使っていますが、numpyは1.12.1です。 動作に大きな違いがあるnumpy/pythonバージョンがありましたか?それとも何らかの形で間違って設定しただけですか?

import numpy as np 
from past.builtins import xrange 


# sample data 
X = np.arange(1, 4*4*3*5+1).reshape(5, 4, 4, 3) 
Y = np.arange(5, 4*4*3*8+5).reshape(8, 4, 4, 3) 
Xlen = X.shape[0] 
Ylen = Y.shape[0] 

# allocate some space for whatever calculation 
rs = np.zeros((Xlen, Ylen)) 
rs1 = np.zeros((Xlen, Ylen)) 

# calculate the result with 2 loops 
for i in xrange(Xlen): 
    for j in xrange(Ylen): 
     rs[i, j] = np.sum(X[i] + Y[j]) 

# calculate the result with one loop only 
for i in xrange(Xlen): 
    rs1[i, :] = np.sum(Y + X[i], axis=(1,2,3)) 

print(rs1 == rs) # same result 

# also with one loop, as everywhere on the internet: 
for i in xrange(Xlen): 
    rs1[i, :] = np.sum(Y + X[i], axis=1) 
    # ValueError: could not broadcast input array from shape (8,4,3) into shape (8) 
+0

'軸= 1'合計だけが一次元。結果は次元 'ndim - 1'の配列です。あなたの場合、それは3次元であり、 '(8、4、3)'の形をしています。これは出力配列 'rs1 [i、:]'と互換性がありません。これは2つの次元しかありません。 – MaxPowers

答えて

0
axis : None or int or tuple of ints, optional 
    ... 
    If axis is a tuple of ints, a sum is performed on all of the axes 
    specified in the tuple instead of a single axis or all the axes as 
    before. 

タプルを使用する能力は、さらに(V1.7、2013)でした。私はそれをあまり使わなかったし、MATLABでそれを必要としたときに、繰り返しの合計を使った。

In [149]: arr = np.arange(24).reshape(2,3,4) 
In [150]: arr.sum(axis=(1,2)) 
Out[150]: array([ 66, 210]) 
In [151]: arr.sum(axis=2).sum(axis=1) 
Out[151]: array([ 66, 210]) 

あなたが心に留めておく必要があるシーケンシャル合計をやってその軸の変化の数(あなたはkeepdimsを使用しない限り、自身やや新しいパラメータ)。


あなたX,Y合計:

In [160]: rs = np.zeros((Xlen, Ylen),int) 
    ...: rs1 = np.zeros((Xlen, Ylen),int) 
    ...: 
    ...: # calculate the result with 2 loops 
    ...: for i in range(Xlen): 
    ...: for j in range(Ylen): 
    ...:  rs[i,j] = np.sum(X[i] + Y[j]) 
    ...: 
In [161]: rs 
Out[161]: 
array([[ 2544, 4848, 7152, 9456, 11760, 14064, 16368, 18672], 
     [ 4848, 7152, 9456, 11760, 14064, 16368, 18672, 20976], 
     [ 7152, 9456, 11760, 14064, 16368, 18672, 20976, 23280], 
     [ 9456, 11760, 14064, 16368, 18672, 20976, 23280, 25584], 
     [11760, 14064, 16368, 18672, 20976, 23280, 25584, 27888]]) 

はループせずに複製することができます。 =>np.sum(X[i]) + np.sum(Y[j])

In [162]: X.sum((1,2,3)) 
Out[162]: array([ 1176, 3480, 5784, 8088, 10392]) 
In [163]: Y.sum((1,2,3)) 
Out[163]: array([ 1368, 3672, 5976, 8280, 10584, 12888, 15192, 17496]) 
In [164]: X.sum((1,2,3))[:,None] + Y.sum((1,2,3)) 
Out[164]: 
array([[ 2544, 4848, 7152, 9456, 11760, 14064, 16368, 18672], 
     [ 4848, 7152, 9456, 11760, 14064, 16368, 18672, 20976], 
     [ 7152, 9456, 11760, 14064, 16368, 18672, 20976, 23280], 
     [ 9456, 11760, 14064, 16368, 18672, 20976, 23280, 25584], 
     [11760, 14064, 16368, 18672, 20976, 23280, 25584, 27888]]) 

np.sum(X[i] + Y[j])sum(X[i])は、すべての要素の合計をX[i](軸=なし)とします。これは、1番目の軸以外のすべての軸で同じ合計です(X.sum(axis=(1,2,3))[i])。放送・エラーについては

In [165]: X[0].sum() 
Out[165]: 1176 
In [166]: X.sum((1,2,3))[0] 
Out[166]: 1176 
In [167]: X.sum(1).sum(1).sum(1)[0] 
Out[167]: 1176 

、作品を見て:

In [168]: rs1[i,:] 
Out[168]: array([0, 0, 0, 0, 0, 0, 0, 0]) # shape (8,) 
In [169]: (Y+X[i]).shape # (8,4,4,3) + (4,4,3) 
Out[169]: (8, 4, 4, 3) 
In [170]: (Y+X[i]).sum(1).shape # sums axis 1, ie one of the 4's 
Out[170]: (8, 4, 3) 
+0

私は最初に繰り返しの合計を使用して終了しましたが、私はタプルを使用して私の場合に読むのが簡単だとわかりました。 まだ、なぜたくさんの人が、軸= 1を使って購入するだけで仕事を得たのか理解できません。これは異なる形になります。 – Nin

+0

私は、 'tuple'オプションの主要な正当性は読みやすいことを期待しています。 – hpaulj

0

が書かれただけaxis=1と同じ結果を得るために、私たちは事前にデータセットを再形成のトリックを行うことができます。

X = np.reshape(X, (X.shape[0], -1)) 
Y = np.reshape(Y, (Y.shape[0], -1)) 

for i in xrange(Xlen): 
    rs[i, :] = np.sum(Y + X[i], axis=1) 
print(rs) 

結果:指定した

[[ 2544. 4848. 7152. 9456. 11760. 14064. 16368. 18672.] 
[ 4848. 7152. 9456. 11760. 14064. 16368. 18672. 20976.] 
[ 7152. 9456. 11760. 14064. 16368. 18672. 20976. 23280.] 
[ 9456. 11760. 14064. 16368. 18672. 20976. 23280. 25584.] 
[ 11760. 14064. 16368. 18672. 20976. 23280. 25584. 27888.]]