机器学习-数据科学库: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 函数* 运算符来实现。回顾一下,它看起来是这样的:

扫描二维码关注公众号,回复: 12411596 查看本文章
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的注意点

  1. 两个nan是不相等的。
  2. nan和任何值计算都是nan
  3. 按行(列)计算数组均值等统计值时,有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()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45031468/article/details/112666024