Yuta NakataのBlog

Python / AWS / ITについて役立つ情報を発信します

numpy.ma.MaskedArrayとnumpy.ndarrayの違いで困った話

困った点

import numpy as np

data = np.array([1.23, 4.56, 7.89], dtype=np.float32)
no_value = np.float32(-9999)
factor = 100

data = np.ma.masked_equal(data, no_value)

# 1. Using data[~data.mask]
result1 = data[~data.mask] * factor
print(result1) # [[123.00000191 455.99999428 788.99998665]]
print(type(result1)) # <class 'numpy.ma.MaskedArray'>
print(result1.dtype) #  float64


# 2. Using data.data[~data.mask]
result2 = data.data[~data.mask] * factor
print(result2) # [[123. 456. 789.]]
print(type(result2)) # <class 'numpy.ndarray'>
print(result2.dtype) # float32

一見同じようなアウトプットになりそうですが、微妙に結果が変わります。

原因は、numpy.ma.MaskedArraynumpy.ndarrayにありそうです。

解決策

factorの取り扱いが問題だったようです。

factor = np.float32(100)

に変更してみましょう。

import numpy as np

data = np.array([1.23, 4.56, 7.89], dtype=np.float32)
no_value = np.float32(-9999)
factor = np.float32(100)

data = np.ma.masked_equal(data, no_value)

# 1. Using data[~data.mask]
result1 = data[~data.mask] * factor
print(result1, type(result1), result1.dtype)
# [[123. 456. 789.]] <class 'numpy.ma.MaskedArray'> float32

# 2. Using data.data[~data.mask]
result2 = data.data[~data.mask] * factor
print(result2, type(result2), result2.dtype)
# [[123. 456. 789.]] <class 'numpy.ndarray'> float32

これで一致しました。どうやら、int,floatの違いが問題だったようです。

同じ問題にあたったら方のヒントになればうれしいです