1、必备知识点
1.1 轴
在numpy中可以理解为方向,使用0,1,2…数字表示,
- 对于一个一维数组,只有一个0轴,
- 对于2维数组(shape(2,2)),有0轴和1轴,
- 对于三维数组(shape(2,2, 3)),有0,1,2轴
有了轴的概念之后,我们计算会更加方便,
比如计算一个2维数组的平均值,必须指定是计算哪个方向上面的数字的平均值
1.2 numpy中矩阵的转置方法
t.transpose()
t.T
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 基本索引
- 取行
# 取行
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行
- 取列
# 取列
print(t2[:,0]) # 所有行的第一列
>>>[4394029 7860119 5845909 ... 142463 2162240 515000]
# 取连续的多列
print(t2[:,2:]) # 所有行第三列及其之后的列
# 取不连续的多列
print(t2[:,[0,2]]) # 所有行的第一列和第三列
- 取行列值(坐标点)
# 取行列值
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中介绍]