次元 (120、360) の numpy 配列が 2 つあります。配列の 1 つは整数で構成され、2 番目の配列は浮動小数点数で構成されます。最初の配列に整数があるすべての場所で、2 番目の配列の値を nans に置き換えたいと思います。これを行う簡単で効率的な方法はありますか?
また、最初の配列の整数を nan に置き換え、ゼロを 1 に変更したいと思います。前もって感謝します。
これは、配列への論理インデックスを使用して簡単に実現できます。
arr2[ arr1 != 0 ] = numpy.NaN
ただし、整数配列はNaNをサポートしていないため、最初の配列をfloat配列に変換する必要があります。
arr1 = arr1.astype(float)
arr1[arr1 != 0.0] = numpy.NaN
arr1[arr1 == 0.0] = 1.0
アレイをセットアップします。
>>> import numpy as np
>>> x = np.array([[1,0],[0,4]], dtype=int)
>>> y = np.array([[1.1, 2.2],[3.3, 4.4]], dtype=float)
次のように、必要な場所で 2 番目の配列を nan に簡単に設定できます。
>>> y[x != 0] = np.nan
>>> y
array([[ nan, 2.2],
[ 3.3, nan]])
次に、最初の配列を float に変換し (NaN は整数ではないため)、必要な値を設定します。
>>> x = x.astype(float)
>>> x[x != 0] = np.nan
>>> x[x == 0] = 1
>>> x
array([[ nan, 1.],
[ 1., nan]])
値をNaNに置き換える目的はわかりませんが、代わりにnumpyのマスクされた配列を使用することを検討することをお勧めします(ピエールの回答と同様ですが、numpyには組み込みのマスクサポートがあります!):
import numpy.ma
# mask out values when there is a non-zero integer in arr1
arr2 = numpy.ma.masked_array(arr2, mask=arr1)
# mask out values in arr2 for non-zero integers, and set all remaining values (the zeros) to 1
arr1 = numpy.ma(arr1, mask=(arr1 != 0))
arr1[~arr1.mask] = 1
整数から浮動小数点数への変換は必要ありません。これにより、多くの numpy の機能を問題なく使用できます。たとえば、NaN を使用して配列の平均を計算することは確かに悪い考えですが、マスクされた配列では問題ありません。
以前の回答に対するコメントとして、フロートを比較する==
ことは良い考えではないと思います.一部の操作は無駄だと思います. 一時的な配列mask = (X != 0)
を作成し、それを index として使用するのはどうですか?
>>> X = X.astype(float)
>>> X[~mask] = np.nan
>>> X[mask] = 1