

numpyの2次元配列の累乗(要素ごとの累乗)が正常にできず困っていましたので教えてください。

環境：  
Python: 3.7.5  
Numpy: 1.17.4

float32型・2次元のnp.array（正または負の実数値を格納、一部NaNを含む）を1.514乗しようとすると、``**`でも`np.power()`
でも以下のエラーが発生して全てNaNになるか、その要素を1.514乗した値ではない値が格納されたnp.arrayが返されます。

[code]

    RuntimeWarning: invalid value encountered in power
    
[/code]

fooはfloat32型で，気象データの配信サーバーからNetCDF形式で取得してきたものです。

NaNが入っているからか？と思い、要素を一つとりだして1.514乗した場合、以下の記述でもRuntime warningになります。

[code]

    foo[0][0] ** 1.514
    (foo：2次元のnp.array)
    
[/code]

ところが、以下の方法でループで要素を一つずつ抜き出して再格納した配列varをつくり、`var ** 1.514` をすると正常な値が戻ってきます。

[code]

    var = np.zeros((len(lat), len(lon))
    for i in range(len(lat)):
        for j in range(len(lon)):
            var[i][j] = foo[i][j]
    (fooがオリジナルのnp.array)
    
[/code]

この方法を使えばとりあえず問題は解消できますが、気味が悪いので原因を教えていただけないでしょうか。  
よろしくお願いします。


CC BY-SA 4.0
2020-04-24T08:42:52.343
65922
2022-01-13T02:03:45.420
2021-11-07T07:44:14.233
3060
35230
question
python numpy
np.arrayの累乗でRuntime warningが発生する


どうも numPyの `power()` 関数は、負や複素数の累乗には対応していないようです。  
私も同じことでひっかかってしまい、この質問に達しましたが、いろいろとぐぐっているうちに、英語のページに同様の質問があり、同様の推察がなされていました。

2乗などの時は、おそらくこの問題は発生しないのですが、1.7乗などとすると、対象がマイナスでなくてもエラーになるようです。

私の対策としては、`abs()` で絶対値をとってしまうことで、多少効率は悪くなりますが対応できました。

[code]

    z = np.power(abs(x), y)
    z = abs(x)**y
    
[/code]

という感じです。


CC BY-SA 4.0
2021-11-07T05:09:08.967
83467
2021-11-07T16:22:51.463
2021-11-07T16:22:51.463
3060
24768
65922
answer