

やりたいことは時間と位置座標の値が入った配列でそれぞれの差分を取って時間ごとの成長率を見たいのですが、具体的には

[code]

    data1=[t,x,y,z]
    data2=[t,x,y,z]
    
[/code]

があって、これの差分を取ればいいと思い、

[code]

    l=data1.shape[0]
    li = data1.shape[1]
    lj = data1.shape[2]
    lk = data1.shape[3]
    lists = []
    s=0
     for t in range (0,l):
        for i in range (0,li):
           for i in range (0,li):
              for j in range (0,lk):
                 s+=sum(np.power((data1[t,i,yn,j]-data2[t,i,yn,j])*2))
     lists.insert(s)
    print(lists)
    
[/code]

としたのですが、

[code]

    s+=sum(np.power((data1[t,i,yn,j]-data2[t,i,yn,j])*2))
    ValueError: invalid number of arguments
    
[/code]

とエラーをはきます。どうすれば良いのでしょうか？  
また、初心者でfor文を回す方法しか思いつかなかったのですが、効率の良い方法があれば教えてください。


CC BY-SA 4.0
2019-12-01T08:44:28.407
60984
2022-10-18T17:00:35.080
2019-12-01T09:07:53.697
32986
36870
question
python numpy
２つの４次元配列で、それらの差分を取った二乗和の１次元の配列を作るにはどうすればいいですか？


`ValueError: invalid number of arguments` の原因は、`np.power`
の引数の数が足りてないことです。`np.power(a, b)` で `a` の `b` 乗を示します。2乗であれば `np.power(なんとかかんとか,
2)` と書けば良いです。

NumPy Array は演算を [broadcast
する](https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html)ので、今回の計算だと
`np.power` を使わなくても簡単に書くことができます。

[code]

    np.sum((data1 - data2) ** 2)
    
[/code]

あるいは

[code]

    ((data1 - data2) ** 2).sum()
    
[/code]

上の書き方だと全ての要素について差の二乗をとって和を計算します。

* * *

もし `t`
の軸について同じインデックスのもの同士それぞれ和を計算したいということであれば、[`np.sum`](https://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html)
の `axis` を指定すると良いです。`axis` とは、どの軸について和をとるかというオプショナル引数です。

[code]

    np.sum((data1 - data2) ** 2, axis=(1,2,3))
    
[/code]

あるいは

[code]

    ((data1 - data2) ** 2).sum(axis=(1,2,3))
    
[/code]


CC BY-SA 4.0
2019-12-01T10:10:08.313
60986
2019-12-01T10:10:08.313
19110
60984
answer