Python中数据置空处理:None与numpy数组的兼容方案
本文详解Python中数据置空的方法。针对普通数据类型,直接赋值None即可;但在numpy数组中,int类型直接赋值None或np.nan会因类型冲突报错。解决方案是将数组转为float类型后再赋值。此外,文章还补充了Python中is与==的区别、None与空字符串的判断,以及nan和inf的多种检测方式,帮助开发者正确处理异常值。
Python数据置空处理概述
摘要
在Python编程中,特别是涉及数组运算时,往往需要对异常值进行特殊处理。为了避免异常值干扰正常数据的计算结果,常见的做法是将这些值置零或置空。置零操作相对简单,本文重点介绍如何在Python中实现数据的置空处理。
赋值为None
对于常规数据类型,可以直接将其赋值为None来实现置空。
i = 1
i = None # int 型数据置空
s = "string"
s = None # 字符串型数据置空
l = [1,2,3,4]
l[2] = None # 列表中元素置空
print(i, s, l)

numpy数组中置空None的兼容方案
numpy类型处理
numpy数组中的数据具有特殊性。如果尝试将一个int类型的元素直接赋值为None或np.nan,程序会抛出报错信息。
a = np.arange(10) a[2] = None

a = np.arange(10) a[2] = np.nan

通过打印np.nan的类型可以发现,它实际上属于float类型。
>>> type(np.nan) <class 'float'>
在numpy数组中,将int类型元素直接赋值为float类型是不被允许的。虽然赋值语句本身不会立即报错,但numpy会自动尝试将float类型转换为int类型,这通常会导致数据截断或精度丢失。
另一方面,打印None的类型会显示其属于NoneType。
>>> type(None) <class 'NoneType'>
关于赋值报错的原因,推测是numpy检测到类型不匹配,且无法在int和NoneType之间进行自动转换,从而引发了错误。
若要在numpy中将元素置空为None或np.nan,建议先将数组的数据类型转换为float。
a = np.arange(10, dtype=float)
a[2] = np.nan
a[3] = None
print(a)

从最终输出结果来看,无论是赋值np.nan还是None,在numpy数组中最终都会显示为nan。
Python类型与变量判断补充知识
补充知识:Python类型判断、变量存在性判断、None与空字符串的区别、is和==运算符的差异,以及nan和inf的判断方法。
一、类型变量判断
type函数
#判断是否为整数
type(varObj) is types.IntType
StringType
FloatType
DictType
TupleType
ListType
BooleanType
isinstance函数
isinstance(aaa,str)
type与isinstance的区别
class A:
pass
class B(A):
pass
isinstance(A(), A) # returns True
type(A()) == A # returns True
isinstance(B(), A) # returns True
type(B()) == A # returns False
二、变量存在性判断
异常捕获机制
try:
print self.fileReadOpen
except Exception:
pass
else:
del self.fileReadOpen
def isset(v):
try :
type (eval(v))
except :
return 0
else :
return 1
isset('varname') //变量只能在try块中调用才会捕获异常,因此采用字符串参数形式。
命名空间检查
'varname' in locals().keys() 'varname' in dir()
当dir()不带参数时,它返回当前作用域内的变量、方法和定义的类型列表;若带参数,则返回该参数的属性和方法列表。如果参数包含dir()方法,该方法将被调用;若不含,则尽可能收集参数信息。
三、None与空字符串的区别
Python中万物皆对象,None本身也是一个对象。这有助于理解None与空字符串NULL的区别:
type(None)
<class 'NoneType'>
type('')
<class ''str'>
>>> None == 0 //(int)
False
>>> None == ' ' //(str)
False
>>> None == False //(boolean)
False
四、is和==的区别
is运算符判断的是对象a是否就是对象b,它是通过比较对象的内存地址(id)来实现的。
==运算符判断的是对象a的值是否与对象b的值相等,它是通过比较对象的值(value)来实现的。
>>> d = {"a":1}
>>> dd = d.copy()
>>> d is dd
False
>>> d == dd
True
五、nan和inf的判断
记忆要点:对于is判断,符合定义的是对象与其本身比较;对于==判断,除了nan之外,符合定义的是值比较。对于nan,在使用==进行值比较时,nan对象的值不等于其自身,也不等于新创建的nan对象。
>>> inf = float("inf")
>>> ninf = float("-inf")
>>> nan = float("nan")
>>> inf is inf
True
>>> ninf is ninf
True
>>> nan is nan
True
>>> inf == inf
True
>>> ninf == ninf
True
>>> nan == nan // nan对象时本身对象nan
False
>>> inf is float("inf")
False
>>> ninf is float("-inf")
False
>>> nan is float("nan")
False
>>> inf == float("inf")
True
>>> ninf == float("-inf")
True
>>> nan == float("nan") //前一个nan值不等于新建对象float("nan")的值
False
判断nan的方法:
使用math模块:
>>> import math
>>> math.isinf(inf)
True
>>> math.isinf(ninf)
True
>>> math.isnan(nan)
True
>>> math.isinf(float("inf"))
True
>>> math.isinf(float("-inf"))
True
>>> math.isnan(float("nan"))
True
利用自身特性判断:
>>> def isnan(num):
return num != num
>>> isnan(float("nan"))
True
使用numpy库:
>>> import numpy as np
>>>
>>> np.isnan(np.nan)
True
>>> np.isnan(float("nan"))
True
>>> np.isnan(float("inf"))
False
以上关于Python实现使用空值进行赋值None的内容分享完毕,希望能对大家有所帮助,也欢迎继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









