numpy(2)本地数据的读取和索引、nan值的介绍

1、必备知识点

1.1 轴

在numpy中可以理解为方向,使用0,1,2…数字表示,

  1. 对于一个一维数组,只有一个0轴,
  2. 对于2维数组(shape(2,2)),有0轴和1轴,
  3. 对于三维数组(shape(2,2, 3)),有0,1,2轴

有了轴的概念之后,我们计算会更加方便,
比如计算一个2维数组的平均值,必须指定是计算哪个方向上面的数字的平均值
在这里插入图片描述
在这里插入图片描述

1.2 numpy中矩阵的转置方法

  1. t.transpose()
  2. t.T
  3. t.swapaxes(1,0)交换轴的意思,x变为y轴,0、1轴互换
In [57]: t2
Out[57]:
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23]])

In [58]: t2.transpose()
Out[58]:

In [59]: t2.T
Out[59]:

In [60]: t2.swapaxes(1,0)
Out[60]:
array([[ 0,  6, 12, 18],
       [ 1,  7, 13, 19],
       [ 2,  8, 14, 20],
       [ 3,  9, 15, 21],
       [ 4, 10, 16, 22],
       [ 5, 11, 17, 23]])

2、读取数据(了解)

读取数据常用pandas中的方法,但是numpy中也有
CSV:Comma-Separated Value,逗号分隔值文件
显示:表格状态
源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录

2.1 方法loadtxt参数

np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)

参数
在这里插入图片描述

2.2 实际操作

数据

在这里插入图片描述
以上txt数据来自YouTube,分别代表点击数、喜欢、不喜欢、评论数

读取此数据

打印矩阵

us_file_path = "./youtube_video_data/US_video_data_numbers.csv"

t2 = np.loadtxt(us_file_path, delimiter=",", dtype="int")
>>>
>[[4394029  320053    5931   46245]
 [7860119  185853   26679       0]
 [5845909  576597   39774  170708]
 ...
 [ 142463    4231     148     279]
 [2162240   41032    1384    4737]
 [ 515000   34727     195    4722]]

转置矩阵unpack=True


t1 = np.loadtxt(us_file_path, delimiter=",", dtype="int", unpack=True)
>>>
[[4394029 7860119 5845909 ...  142463 2162240  515000]
 [ 320053  185853  576597 ...    4231   41032   34727]
 [   5931   26679   39774 ...     148    1384     195]
 [  46245       0  170708 ...     279    4737    4722]]

3、numpy索引和切片

3.1 基本索引

  1. 取行
# 取行
print(t2[2])

# 取连续的多行
print(t2[2:])	# 3行之后所有行

# 取不连续的多行
print(t2[[2, 8, 10]])

print(t2[1, :])		# 第一行所有
print(t2[2:, :])	# 第二行及其之后的所有行
print(t2[[2, 10, 3], :])		# 第2,10,3行
  1. 取列
# 取列
print(t2[:,0])		# 所有行的第一列
>>>[4394029 7860119 5845909 ...  142463 2162240  515000]

# 取连续的多列
print(t2[:,2:])		# 所有行第三列及其之后的列

# 取不连续的多列
print(t2[:,[0,2]])		# 所有行的第一列和第三列
  1. 取行列值(坐标点)
# 取行列值
a = t2[2, 3]
print(a)
print(type(a))
>>>
170708
<class 'numpy.int32'>

# 取多行和多列,取第3行到第五行,第2列到第4列的交叉点值
b = t2[2:5, 1:4]		# 3到5行,2到4列的交叉点值

# 取多个不相邻的点
# 选出来的结果是(0,0) (2,1) (2,3)三个值
c = t2[[0, 2, 2], [0, 1, 3]]		# 注意是两个内括号中的值一一对应的行列
print(c)

3.2 其他索引

小于大于索引

In [62]: t2 < 10	# 布尔索引
Out[62]:
array([[ True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True, False, False],
       [False, False, False, False, False, False],
       [False, False, False, False, False, False]])
       
In [69]: t2[t2<10]
Out[69]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

**注意:**类型是numpy.init64的特殊int类型

4、数值的修改

4.1 条件修改

In [63]: t2[t2<10] = 3	# 修改小于10的元素

In [64]: t2
Out[64]:
array([[ 3,  3,  3,  3,  3,  3],
       [ 3,  3,  3,  3, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23]])

4.2 三元运算符修改np.where()

原理:

In [75]: a = 3 if 3>2 else 4

In [76]: a
Out[76]: 3

In [77]: a = 3 if 3<2 else 4

In [78]: a
Out[78]: 4

所以


In [79]: np.where(t2<=3, 100, 300)
Out[79]:
array([[100, 100, 100, 100, 100, 100],
       [100, 100, 100, 100, 300, 300],
       [300, 300, 300, 300, 300, 300],
       [300, 300, 300, 300, 300, 300]])

4.3 clip()(裁剪)

In [81]: t2 = t2.astype(float)

In [82]: t2[3,3] = np.nan

In [83]: t2
Out[83]:
array([[ 3.,  3.,  3.,  3.,  3.,  3.],
       [ 3.,  3.,  3.,  3., 10., 11.],
       [12., 13., 14., 15., 16., 17.],
       [18., 19., 20., nan, 20., 20.]])

In [84]: t2.clip(10,18)
Out[84]:
array([[10., 10., 10., 10., 10., 10.],
       [10., 10., 10., 10., 10., 11.],
       [12., 13., 14., 15., 16., 17.],
       [18., 18., 18., nan, 18., 18.]])

注意

  • numpy中将int类型转换成float类型用t.astype(float)
  • clip(10, 18)的用法是将小于10的转换成10,大于18的站换成18,是否等于不影响
  • nan不受clip的改变

5、nan和inf是什么

什么时候numpy中会出现nan:
当我们读取本地的文件为float的时候,如果有缺失,就会出现nan
当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)、

如何指定一个nan或者inf?(注意他们的type类型)

In [21]: a = np.inf

In [22]: b = np.nan

In [23]: a,b
Out[23]: (inf, nan)

注意:

  • nan not a number
  • np.nan != np.nan 两个nan不相等
  • 任何值和nan进行计算都是nan
  • inf 无穷
  • inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷

问题

问题1:
在一组数据中单纯的把nan替换为0,合适么?会带来什么样的影响?

比如,全部替换为0后,替换之前的平均值如果大于0,替换之后的均值肯定会变小,所以更一般的方式是把缺失的数值替换为均值(中值)或者是直接删除有缺失值的一行
问题2:
如何计算一组数据的中值或者是均值
如何删除有缺失数据的那一行(列)[在pandas中介绍]

6、总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值