Python中数据置空处理:None与numpy数组的兼容方案

键盘旁的猫
键盘旁的猫
发布时间:2026-10-13 | 2人浏览过
原创

本文详解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的内容分享完毕,希望能对大家有所帮助,也欢迎继续支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表