ฉันต้องการหาวิธีลบค่าน่านออกจากอาร์เรย์ของฉัน อาร์เรย์ของฉันมีลักษณะดังนี้:
x = [1400, 1500, 1600, nan, nan, nan ,1700] #Not in this exact configuration
ฉันจะลบnan
ค่าออกจากได้x
อย่างไร
ฉันต้องการหาวิธีลบค่าน่านออกจากอาร์เรย์ของฉัน อาร์เรย์ของฉันมีลักษณะดังนี้:
x = [1400, 1500, 1600, nan, nan, nan ,1700] #Not in this exact configuration
ฉันจะลบnan
ค่าออกจากได้x
อย่างไร
คำตอบ:
หากคุณใช้ numpy สำหรับอาร์เรย์ของคุณคุณยังสามารถใช้
x = x[numpy.logical_not(numpy.isnan(x))]
เท่า
x = x[~numpy.isnan(x)]
[ขอบคุณ chbrown สำหรับชวเลขที่เพิ่ม]
คำอธิบาย
ฟังก์ชั่นด้านในnumpy.isnan
ส่งกลับอาร์เรย์แบบบูล / ตรรกะซึ่งมีค่าTrue
ทุกที่ที่x
ไม่ใช่ -a-number ตามที่เราต้องการตรงกันข้ามเราใช้ตัวดำเนินการแบบลอจิคัล - ไม่ใช่~
เพื่อรับอาเรย์ด้วยTrue
s ทุก ๆ ที่x
เป็นจำนวนที่ถูกต้อง
สุดท้ายเราใช้โลจิคัลอาเรย์นี้เพื่อทำดัชนีในอาเรย์ดั้งเดิมx
เพื่อดึงค่าที่ไม่ใช่ NaN
x = x[numpy.isfinite(x)]
x = x[~numpy.isnan(x)]
ซึ่งเทียบเท่ากับคำตอบดั้งเดิมของ mutzmatron แต่สั้นกว่า ในกรณีที่คุณต้องการที่จะเก็บอนันต์ของรอบรู้ว่าnumpy.isfinite(numpy.inf) == False
แน่นอน ~numpy.isnan(numpy.inf) == True
แต่
np.where(np.isfinite(x), x, 0)
x
ไม่ใช่อาร์เรย์ที่มีค่ามาก หากคุณต้องการใช้การทำดัชนีเชิงตรรกะมันจะต้องเป็นอาร์เรย์ - เช่นx = np.array(x)
filter(lambda v: v==v, x)
ใช้ได้ทั้งกับ list และ numpy array ตั้งแต่ v! = v เฉพาะ NaN เท่านั้น
x
x[~numpy.isnan(x)]
สิ่งนี้จะสะดวกเมื่อx
ถูกกำหนดโดยนิพจน์แบบยาวและคุณไม่ต้องการให้โค้ดยุ่งเหยิงโดยการสร้างตัวแปรชั่วคราวเพื่อเก็บผลลัพธ์ของนิพจน์แบบยาวนี้
ลองสิ่งนี้:
import math
print [value for value in x if not math.isnan(value)]
สำหรับข้อมูลเพิ่มเติมอ่านในรายการ comprehensions
print ([value for value in x if not math.isnan(value)])
np
แพ็คเกจ: ดังนั้นส่งคืนรายการของคุณโดยไม่มี nans:[value for value in x if not np.isnan(value)]
สำหรับฉันคำตอบโดย @jmetz ไม่ทำงาน แต่ใช้ pandas isnull () ทำ
x = x[~pd.isnull(x)]
ทำข้างต้น:
x = x[~numpy.isnan(x)]
หรือ
x = x[numpy.logical_not(numpy.isnan(x))]
ฉันพบว่าการรีเซ็ตเป็นตัวแปรเดียวกัน (x) ไม่ได้ลบค่าน่านจริงและต้องใช้ตัวแปรอื่น การตั้งค่าให้กับตัวแปรที่แตกต่างลบ nans เช่น
y = x[~numpy.isnan(x)]
ตามที่ปรากฏโดยคนอื่น ๆ
x[~numpy.isnan(x)]
โรงงาน แต่มันจะโยนข้อผิดพลาดถ้า ntyty dtype ไม่ใช่ชนิดข้อมูลดั้งเดิมตัวอย่างเช่นถ้ามันเป็นวัตถุ ในกรณีนี้คุณสามารถใช้นุ่น
x[~pandas.isna(x)] or x[~pandas.isnull(x)]
คำตอบที่ได้รับการยอมรับการเปลี่ยนแปลงรูปร่างสำหรับอาร์เรย์ 2 มิติ ฉันขอเสนอวิธีแก้ปัญหาที่นี่โดยใช้ฟังก์ชั่นPandas dropna () มันใช้งานได้กับ 1D และ 2D อาร์เรย์ ในกรณี 2D ท่านสามารถเลือกสภาพอากาศที่จะวางแถวหรือคอลัมน์np.nan
ที่มี
import pandas as pd
import numpy as np
def dropna(arr, *args, **kwarg):
assert isinstance(arr, np.ndarray)
dropped=pd.DataFrame(arr).dropna(*args, **kwarg).values
if arr.ndim==1:
dropped=dropped.flatten()
return dropped
x = np.array([1400, 1500, 1600, np.nan, np.nan, np.nan ,1700])
y = np.array([[1400, 1500, 1600], [np.nan, 0, np.nan] ,[1700,1800,np.nan]] )
print('='*20+' 1D Case: ' +'='*20+'\nInput:\n',x,sep='')
print('\ndropna:\n',dropna(x),sep='')
print('\n\n'+'='*20+' 2D Case: ' +'='*20+'\nInput:\n',y,sep='')
print('\ndropna (rows):\n',dropna(y),sep='')
print('\ndropna (columns):\n',dropna(y,axis=1),sep='')
print('\n\n'+'='*20+' x[np.logical_not(np.isnan(x))] for 2D: ' +'='*20+'\nInput:\n',y,sep='')
print('\ndropna:\n',x[np.logical_not(np.isnan(x))],sep='')
ผลลัพธ์:
==================== 1D Case: ====================
Input:
[1400. 1500. 1600. nan nan nan 1700.]
dropna:
[1400. 1500. 1600. 1700.]
==================== 2D Case: ====================
Input:
[[1400. 1500. 1600.]
[ nan 0. nan]
[1700. 1800. nan]]
dropna (rows):
[[1400. 1500. 1600.]]
dropna (columns):
[[1500.]
[ 0.]
[1800.]]
==================== x[np.logical_not(np.isnan(x))] for 2D: ====================
Input:
[[1400. 1500. 1600.]
[ nan 0. nan]
[1700. 1800. nan]]
dropna:
[1400. 1500. 1600. 1700.]
หากคุณกำลังใช้ numpy
# first get the indices where the values are finite
ii = np.isfinite(x)
# second get the values
x = x[ii]
วิธีที่ง่ายที่สุดคือ:
numpy.nan_to_num(x)
เอกสารประกอบ: https://docs.scipy.org/doc/numpy/reference/generated/numpy.nan_to_num.html
NaN
จำนวนมากในขณะที่ OP ขอให้ลบองค์ประกอบทั้งหมด
นี่เป็นวิธีการของฉันในการกรองndarray "X" สำหรับ NaN และ infs
ฉันสร้างแผนที่ของแถวโดยไม่ต้องใดNaN
ๆinf
ดังนี้:
idx = np.where((np.isnan(X)==False) & (np.isinf(X)==False))
idx เป็นสิ่งอันดับ มันคือคอลัมน์ที่สอง ( idx[1]
) มีดัชนีของอาร์เรย์ที่ไม่มีNaNหรือinfที่พบข้ามแถว
แล้ว:
filtered_X = X[idx[1]]
filtered_X
มี X โดยไม่ต้อง มิได้NaN
inf
@ คำตอบของ jmetzน่าจะเป็นสิ่งที่คนส่วนใหญ่ต้องการ; อย่างไรก็ตามมันให้ผลเป็นอาร์เรย์หนึ่งมิติเช่นทำให้ไม่สามารถลบแถวหรือคอลัมน์ทั้งหมดในเมทริกซ์ได้
ในการทำเช่นนั้นหนึ่งควรลดอาร์เรย์โลจิคัลเป็นหนึ่งมิติจากนั้นทำดัชนีอาร์เรย์เป้าหมาย ตัวอย่างเช่นต่อไปนี้จะลบแถวที่มีค่า NaN อย่างน้อยหนึ่งค่า:
x = x[~numpy.isnan(x).any(axis=1)]