從 NumPy 陣列中刪除 Nan 值

Vaibhav Vaibhav 2023年1月30日
  1. 在 NumPy 中使用 logical_not()isnan() 方法刪除 Nan 值
  2. 在 NumPy 中使用 isfinite() 方法刪除 Nan 值
  3. 使用 math.isnan 方法刪除 Nan 值
  4. 使用 pandas.isnull 方法刪除 Nan 值
從 NumPy 陣列中刪除 Nan 值

本文將討論一些內建的 NumPy 函式,你可以使用這些函式刪除 nan 值。

在 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 2Line 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 值

除了這兩個 NumPy 解決方案之外,還有兩種其他刪除 nan 值的方法。這兩種方式涉及 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]
作者: Vaibhav Vaibhav
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.