机器学习-数据科学库:numpy总结
numpy总结
什么是numpy
一个在Python中做科学计算的基础库,重在数值计算,也
是大部分PYTHON科学计算库的基础库,多用于在大型、多
维数组上执行数值运算。
numpy创建数组(矩阵)
代码示例:
import numpy as np
a = np.array([1,2,3,4])
b = np.arange(10)
c = np.array(range(10))
print(a)
print(type(a))
print(a.dtype)
print(b)
print(type(b))
print(b.dtype)
print(c)
print(type(c))
print(c.dtype)
执行结果:
[1 2 3 4]
<class 'numpy.ndarray'>
int32
[0 1 2 3 4 5 6 7 8 9]
<class 'numpy.ndarray'>
int32
[0 1 2 3 4 5 6 7 8 9]
<class 'numpy.ndarray'>
int32
b和c的内容是相同的说明 arange 和 array(range()) 效果是等价的。
numpy中常见的更多数据类型
数据类型的操作
指定创建数据的数组类型:
In [1]: import numpy as np
In [2]: a = np.array([1,1,1,1,1,0,0,0,0,0], dtype=bool)
In [3]: a
Out[3]:
array([ True, True, True, True, True, False, False, False, False,
False])
In [4]: a.dtype
Out[4]: dtype('bool')
修改数据类型
In [10]: a.astype(np.int8)
Out[10]: array([0, 1, 2, 3, 4, 5, 6, 7, 8], dtype=int8)
In [12]: a.astype("i2")
Out[12]: array([0, 1, 2, 3, 4, 5, 6, 7, 8], dtype=int16)
数组的形状
In [5]: a = np.arange(9)
In [6]: a
Out[6]: array([0, 1, 2, 3, 4, 5, 6, 7, 8])
In [7]: a.shape
Out[7]: (9,)
In [8]: a.reshape(3,3)
Out[8]:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
数组和数的计算
广播原则
In [14]: a
Out[14]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [15]: a + 1
Out[15]: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
In [16]: a * 2
Out[16]: array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
In [20]: b = np.array([1,2])
In [24]: c = a.reshape(5,2)
In [25]: c + b
Out[25]:
array([[ 1, 3],
[ 3, 5],
[ 5, 7],
[ 7, 9],
[ 9, 11]])
In [26]: c * b
Out[26]:
array([[ 0, 2],
[ 2, 6],
[ 4, 10],
[ 6, 14],
[ 8, 18]])
NumPy 矩阵乘法
元素级乘法
可以使用 multiply 函数或 * 运算符来实现。回顾一下,它看起来是这样的:
m = np.array([[1,2,3],[4,5,6]])
m
# 显示以下结果:
# array([[1, 2, 3],
# [4, 5, 6]])
n = m * 0.25
n
# 显示以下结果:
# array([[ 0.25, 0.5 , 0.75],
# [ 1. , 1.25, 1.5 ]])
m * n
# 显示以下结果:
# array([[ 0.25, 1. , 2.25],
# [ 4. , 6.25, 9. ]])
np.multiply(m, n) # 相当于 m * n
# 显示以下结果:
# array([[ 0.25, 1. , 2.25],
# [ 4. , 6.25, 9. ]])
矩阵乘积
要获得矩阵乘积,可以使用 NumPy 的 matmul 函数。
a = np.array([[1,2,3,4],[5,6,7,8]])
a
# 显示以下结果:
# array([[1, 2, 3, 4],
# [5, 6, 7, 8]])
a.shape
# 显示以下结果:
# (2, 4)
b = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
b
# 显示以下结果:
# array([[ 1, 2, 3],
# [ 4, 5, 6],
# [ 7, 8, 9],
# [10, 11, 12]])
b.shape
# 显示以下结果:
# (4, 3)
c = np.matmul(a, b)
c
# 显示以下结果:
# array([[ 70, 80, 90],
# [158, 184, 210]])
c.shape
# 显示以下结果:
# (2, 3)
NumPy 的 dot 函数
有时候,在你以为要用 matmul 函数的地方,你可能会看到 NumPy 的 dot 函数。事实证明,如果矩阵是二维的,那么 dot 和 matmul 函数的结果是相同的。
a = np.array([[1,2],[3,4]])
a
# 显示以下结果:
# array([[1, 2],
# [3, 4]])
np.dot(a,a)
# 显示以下结果:
# array([[ 7, 10],
# [15, 22]])
a.dot(a) # you can call你可以直接对 `ndarray` 调用 `dot`
# 显示以下结果:
# array([[ 7, 10],
# [15, 22]])
np.matmul(a,a)
# array([[ 7, 10],
# [15, 22]])
虽然这两个函数对于二维数据返回相同的结果,但在用于其他数据形状时,你应该谨慎选择。你可以在 matmul和 dot 文档中详细了解它们的差异,并找到其他 NumPy 函数的链接。
轴(axis)
在numpy中可以理解为方向,使用0,1,2…数字表示,对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2, 3)),有0,1,2轴。
有了轴的概念之后,我们计算会更加方便,比如计算一个2维数组的平均值,必须指定是计算哪个轴上面的数字的平均值。
二维数组的轴
三维数组的轴
numpy读取数据
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
numpy中的转置
转置是一种变换,对于numpy中的数组来说,就是在对角线方向交换数据,目的也是为了更方便的去处理数据。
In [27]: c
Out[27]:
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
In [28]: c.transpose()
Out[28]:
array([[0, 2, 4, 6, 8],
[1, 3, 5, 7, 9]])
In [29]: c.T
Out[29]:
array([[0, 2, 4, 6, 8],
[1, 3, 5, 7, 9]])
In [31]: c.swapaxes(0,1)
Out[31]:
array([[0, 2, 4, 6, 8],
[1, 3, 5, 7, 9]])
numpy索引和切片
对于刚刚加载出来的数据,我如果只想选择其中的某一列(行)我们应该怎么做呢?
In [32]: c
Out[32]:
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
In [33]: c[1] #取第2行
Out[33]: array([2, 3])
In [34]: c[:,1] #取第2列
Out[34]: array([1, 3, 5, 7, 9])
In [35]: c[0,1] #第1行第2列
Out[35]: 1
In [36]: c[0:3] #取连续多行
Out[36]:
array([[0, 1],
[2, 3],
[4, 5]])
In [40]: c[(0,2,3),] #取离散多行
Out[40]:
array([[0, 1],
[4, 5],
[6, 7]])
numpy中数值的修改
将c中的第一行第二列改为3:
In [41]: c
Out[41]:
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
In [42]: c[0,1] = 3
In [43]: c
Out[43]:
array([[0, 3],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
numpy中布尔索引
In [43]: c
Out[43]:
array([[0, 3],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
In [44]: c < 5
Out[44]:
array([[ True, True],
[ True, True],
[ True, False],
[False, False],
[False, False]])
把t中小于5的数字替换为0
In [45]: c[c<5] = 0
In [46]: c
Out[46]:
array([[0, 0],
[0, 0],
[0, 5],
[6, 7],
[8, 9]])
numpy中三元运算符
把t中小于10的数字替换为0,把大于10的替换为10:
In [56]: a
Out[56]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [51]: np.where(a<5,0,5)
Out[51]: array([0, 0, 0, 0, 0, 5, 5, 5, 5, 5])
numpy中的clip(裁剪)
把t中小于5的数字替换为5,把大于15的替换为15
In [59]: a
Out[59]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
In [60]: a.clip(5,15)
Out[60]:
array([[ 5, 5, 5, 5, 5],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 15, 15, 15, 15]])
numpy中的nan和inf
nan(NAN,Nan):notanumber表示不是一个数字。
什么时候numpy中会出现nan:
- 当我们读取本地的文件为float的时候,如果有缺失,就会出现nan
- 当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)
inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷。
什么时候回出现inf包括(-inf,+inf):
- 比如一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf)
nan和inf的类型:
In [62]: type(np.nan)
Out[62]: float
In [63]: type(np.inf)
Out[63]: float
numpy中的nan的注意点
- 两个nan是不相等的。
- nan和任何值计算都是nan
- 按行(列)计算数组均值等统计值时,有nan的行(列)为nan
In [86]: np.nan == np.nan
Out[86]: False
In [87]: a
Out[87]:
array([[nan, 1., 2., 3., 4.],
[ 5., 6., 7., 8., 9.]])
In [88]: np.mean(a, axis=0)
Out[88]: array([nan, 3.5, 4.5, 5.5, 6.5])
In [89]: np.sum(a, axis=1)
Out[89]: array([nan, 35.])
numpy中常用统计函数
求和:np.sum(a, axis=None)
均值:np.mean(a, axis=None) 受离群点的影响较大
中值:np.median(a, axis=None)
最大值:np.max(a, axis=None)
最小值:np.min(a, axis=None)
极值:np.ptp(a, axis=None)即最大值和最小值只差
标准差:np.std(a, axis=None)
默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果。
代码示例:
In [99]: a
Out[99]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17]])
In [100]: np.mean(a)
Out[100]: 8.5
In [101]: np.sum(a)
Out[101]: 153
In [102]: np.std(a)
Out[102]: 5.188127472091127
In [103]: np.max(a)
Out[103]: 17
In [104]: np.min(a)
Out[104]: 0
In [106]: np.median(a)
Out[106]: 8.5
In [107]: np.sum(a, axis=0) #按列求和,将行的维度变为1
Out[107]: array([18, 21, 24, 27, 30, 33])
In [108]: np.sum(a, axis=1) #按行求和,将列的维度变为1
Out[108]: array([15, 51, 87])
numpy结合matplotlib绘图
任务1:美国youtube1000的数据结合之前的matplotlib绘制评论数量的直方图
import numpy as np
import matplotlib.pyplot as plt
us_path = "./youtube_video_data/US_video_data_numbers.csv"
gb_path = "./youtube_video_data/GB_video_data_numbers.csv"
us_video = np.loadtxt(us_path, delimiter=",", dtype=int)
gb_video = np.loadtxt(gb_path, delimiter=",", dtype=int)
us_video_comments = us_video[:, -1]
us_video_comments = us_video_comments[us_video_comments < 50000]
print(us_video_comments.max() - us_video_comments.min())
#计算组数
d = 2500 #组距
num_bins = (max(us_video_comments)-min(us_video_comments)) // d
#图形大小
plt.figure(figsize=(20, 8), dpi = 80)
#设置字体和负号的代码
plt.rcParams['font.sans-serif']=['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
#绘图风格
plt.style.use('ggplot')
#设置x轴的刻度
plt.xticks(range(min(us_video_comments),max(us_video_comments)+d,d))
#绘图
plt.hist(us_video_comments,num_bins)
plt.show()
任务2:希望了解英国的youtube中视频的评论数和喜欢数的关系,应该如何绘制改图
import numpy as np
import matplotlib.pyplot as plt
us_path = "./youtube_video_data/US_video_data_numbers.csv"
gb_path = "./youtube_video_data/GB_video_data_numbers.csv"
us_video = np.loadtxt(us_path, delimiter=",", dtype=int)
gb_video = np.loadtxt(gb_path, delimiter=",", dtype=int)
gb_video_comments = gb_video[:, -1]
gb_like_num = gb_video[:, 1]
#图形大小
plt.figure(figsize=(10, 8), dpi = 80)
#设置字体和负号的代码
plt.rcParams['font.sans-serif']=['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
#绘图风格
plt.style.use('ggplot')
#绘图
plt.scatter(gb_like_num, gb_video_comments)
plt.show()