NAN和INF值处理。
NAN:Not A number,不是一个数字的意思,但是他是浮点类型的,所以想要进行数据操作的时候需要注意他的类型。
import numpy as np
data = np.random.randint(0,10,size=(3,5))
data = data.astype(np.float64)
#将数组中某个位置的值设置为NAN
data[0,1]=np.NAN
print(data)
[[ 2. nan 9. 6. 5.]
[ 4. 4. 0. 9. 2.]
[ 2. 9. 3. 8. 1.]]
#删除缺失值
#第一种方式: 删除所有NAN的值,因为删除了值后数组将不知道该怎么变化,所以会被变成一维数组。
#~表示取反
print(data[~np.isnan(data)])
#第二种方式: 删除NAN所在行
## 获取哪些行有NAN
lines = np.where(np.isnan(data))[0]
## 使用delete方法删除指定的行,lines表示删除的行号,axis=0表示删除行
print(np.delete(data,lines,axis=0))
[2. 9. 6. 5. 4. 4. 0. 9. 2. 2. 9. 3. 8. 1.]
[[4. 4. 0. 9. 2.]
[2. 9. 3. 8. 1.]]
有以下score2.csv文件。
姓名,语文,数学,英语
张三,78,98,78
李四,,65,81
王五,77,,91
要求把所有空值替换为0。
#从文件中读取数据
#注意:这里dtype必须设置为object类型
scores = np.loadtxt("score2.csv",delimiter=",",skiprows=1,dtype=np.object_)
'''
当使用numpy.array时,若使用numpy.array()创建array,如果array中元素为String,
创建前字符串长度为L,则对字符串重新赋值时,赋值后的字符串不能超过L,
np会将修改有的字符串自动截断到L。原因为在利用numpy.array()创建array时为每个元素分配了一个固定大小的存储空间,
超出其存储空间的部分会截断。
'''
#scores = np.loadtxt("score2.csv",delimiter=",",skiprows=1,dtype=np.str_)
print(scores)
# 将除第一列的数据转换为float类型
new_arr = scores[:, 1:]
print(new_arr)
#将空数据转换成NAN
new_arr[new_arr == ""] = np.nan
print(new_arr)
#转化成float类型
new_arr = new_arr.astype(np.float_)
#将NAN替换为0
new_arr[np.isnan(new_arr)]=0
print(new_arr)
[['张三' '78' '98' '78']
['李四' '' '65' '81']
['王五' '77' '' '91']]
[['78' '98' '78']
['' '65' '81']
['77' '' '91']]
[['78' '98' '78']
[nan '65' '81']
['77' nan '91']]
[[78. 98. 78.]
[ 0. 65. 81.]
[77. 0. 91.]]
Infinity,代表的是无穷大的意思,也是属于浮点类型。np.inf表示正无穷大,-np.inf表示负无穷大,一般在出现除数为0的时候为无穷大。比如2/0
小结: