NumPy 配列から Nan 値を削除する
-
NumPy の
logical_not()
およびisnan()
メソッドを使用して Nan 値を削除する -
NumPy の
isfinite()
メソッドを使用して Nan 値を削除する -
math.isnan
メソッドを使用して Nan 値を削除する -
pandas.isnull
メソッドを使用して Nan 値を削除する
この記事では、nan
値を削除するために使用できるいくつかの組み込み NumPy 関数について説明します。
NumPy の logical_not()
および isnan()
メソッドを使用して Nan 値を削除する
logical_not()
は、配列の要素に論理 NOT
を適用するために使用されます。isnan()
は、要素が nan
であるかどうかをチェックするブール関数です。
isnan()
関数を使用して、すべての非 nan
値に対して False
を持ち、すべての nan
値に対して True
を持つブール配列を作成できます。次に、logical_not()
関数を使用して、True
を False
に、またはその逆に変換できます。
最後に、ブールインデックスを使用して、元の NumPy 配列からすべての非 nan
値をフィルタリングできます。値が True
のすべてのインデックスは、NumPy 配列のフィルタリングに使用されます。
これらの機能の詳細については、それぞれ公式ドキュメントとこちらを参照してください。
解決策については、次のコードスニペットを参照してください。
import numpy as np
myArray = np.array([1, 2, 3, np.nan, np.nan, 4, 5, 6, np.nan, 7, 8, 9, np.nan])
output1 = myArray[np.logical_not(np.isnan(myArray))] # Line 1
output2 = myArray[~np.isnan(myArray)] # Line 2
print(myArray)
print(output1)
print(output2)
出力:
[ 1. 2. 3. nan nan 4. 5. 6. nan 7. 8. 9. nan]
[1. 2. 3. 4. 5. 6. 7. 8. 9.]
[1. 2. 3. 4. 5. 6. 7. 8. 9.]
Line 2
は Line 1
の簡略版です。
NumPy の isfinite()
メソッドを使用して Nan 値を削除する
名前が示すように、isfinite()
関数は、要素が有限であるかどうかをチェックするブール関数です。また、配列内の有限値をチェックして、同じもののブール配列を返すこともできます。ブール配列は、すべての nan
値に対して False
を格納し、すべての有限値に対して True
を格納します。
この関数を使用して、ターゲット配列のブール配列を取得します。ブールインデックスを使用して、すべての有限値をフィルタリングします。繰り返しになりますが、前述のように、True
値のインデックスを使用して配列をフィルタリングします。
これがサンプルコードです。
import numpy as np
myArray1 = np.array([1, 2, 3, np.nan, np.nan, 4, 5, 6, np.nan, 7, 8, 9, np.nan])
myArray2 = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan])
myArray3 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
output1 = myArray1[np.isfinite(myArray1)]
output2 = myArray2[np.isfinite(myArray2)]
output3 = myArray3[np.isfinite(myArray3)]
print(myArray1)
print(myArray2)
print(myArray3)
print(output1)
print(output2)
print(output3)
出力:
[ 1. 2. 3. nan nan 4. 5. 6. nan 7. 8. 9. nan]
[nan nan nan nan nan nan]
[ 1 2 3 4 5 6 7 8 9 10]
[1. 2. 3. 4. 5. 6. 7. 8. 9.]
[]
[ 1 2 3 4 5 6 7 8 9 10]
この機能の詳細については、公式ドキュメントを参照してください。
math.isnan
メソッドを使用して Nan 値を削除する
これらの 2つの NumPy ソリューションとは別に、nan
値を削除する方法がさらに 2つあります。これらの 2つの方法には、math
ライブラリの isnan()
関数と pandas
ライブラリの isnull
関数が含まれます。これらの関数は両方とも、要素が nan
であるかどうかをチェックし、ブール結果を返します。
これが isnan()
メソッドを使用した解決策です。
import numpy as np
import math
myArray1 = np.array([1, 2, 3, np.nan, np.nan, 4, 5, 6, np.nan, 7, 8, 9, np.nan])
myArray2 = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan])
myArray3 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
booleanArray1 = [not math.isnan(number) for number in myArray1]
booleanArray2 = [not math.isnan(number) for number in myArray2]
booleanArray3 = [not math.isnan(number) for number in myArray3]
print(myArray1)
print(myArray2)
print(myArray3)
print(myArray1[booleanArray1])
print(myArray2[booleanArray2])
print(myArray3[booleanArray3])
出力:
[ 1. 2. 3. nan nan 4. 5. 6. nan 7. 8. 9. nan]
[nan nan nan nan nan nan]
[ 1 2 3 4 5 6 7 8 9 10]
[1. 2. 3. 4. 5. 6. 7. 8. 9.]
[]
[ 1 2 3 4 5 6 7 8 9 10]
pandas.isnull
メソッドを使用して Nan 値を削除する
以下は、pandas
の isnull()
メソッドを使用したソリューションです。
import numpy as np
import pandas as pd
myArray1 = np.array([1, 2, 3, np.nan, np.nan, 4, 5, 6, np.nan, 7, 8, 9, np.nan])
myArray2 = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan])
myArray3 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
booleanArray1 = [not pd.isnull(number) for number in myArray1]
booleanArray2 = [not pd.isnull(number) for number in myArray2]
booleanArray3 = [not pd.isnull(number) for number in myArray3]
print(myArray1)
print(myArray2)
print(myArray3)
print(myArray1[booleanArray1])
print(myArray2[booleanArray2])
print(myArray3[booleanArray3])
print(myArray1[~pd.isnull(myArray1)]) # Line 1
print(myArray2[~pd.isnull(myArray2)]) # Line 2
print(myArray3[~pd.isnull(myArray3)]) # Line 3
出力:
[ 1. 2. 3. nan nan 4. 5. 6. nan 7. 8. 9. nan]
[nan nan nan nan nan nan]
[ 1 2 3 4 5 6 7 8 9 10]
[1. 2. 3. 4. 5. 6. 7. 8. 9.]
[]
[ 1 2 3 4 5 6 7 8 9 10]
[1. 2. 3. 4. 5. 6. 7. 8. 9.]
[]
[ 1 2 3 4 5 6 7 8 9 10]