这里是 markdown 版本的week 2-4 笔记,快来了解Numpy 、Scipy、MatPlotLib 以及Seaborn 的基本使用方法吧

Start with Me | Coursera - Understanding and Visualizing Data with Python week 2-4 - NumPy、Scipy、MatPlotLib、Seaborn

NumPy

NumPy 是 Python 进行科学计算的基本库 包括:

  • 一个强大的 N 维数组对象
  • 复杂的功能
  • 集成 C/C++ 和 Fortran 代码的工具
  • 实用的线性代数、傅里叶变换和随机数功能 我们将关注 NumPy 数组对象

NumPy 数组

  • NumPy 数组是一个所有的值都是相同类型的网格,由非负整数元组索引
  • 数组的维度是数组的等级
  • 数组的形状是一个整数元组 tuple ,给出了数组在每个维度上的大小
import numpy as np
# 创建一个长度为3的一维 NumPy 数组
a = np.array([1, 2, 3])
# 输出对象的类型
print("type of a is",type(a))
# 输出形状
print("shape of a is",a.shape)
# 输出a中的一些值
print("value of a[0] is",a[0],
      "\nvalue of a[1] is",a[1],
      "\nvalue of a[2] is",a[2])
type of a is <class 'numpy.ndarray'>
shape of a is (3,)
value of a[0] is 1 
value of a[1] is 2 
value of a[2] is 3
# 创建一个 2x2 的二维 NumPy 数组
b = np.array([[1, 2], [3, 4]])
# 输出形状
print("shape of b is", b.shape)
# 输出b中的一些值
print(f"value of b[0][0] is {b[0][0]}\n"
     f"value of b[0][1] is {b[0][1]}\n"
     f"value of b[1][1] is {b[1,1]}")
shape of b is (2, 2)
value of b[0][0] is 1
value of b[0][1] is 2
value of b[1][1] is 4
# 创建一个 3x2 的二维 NumPy 数组
c = np.array([[1, 2], [3, 4], [5, 6]])
# 输出形状
print("shape of c is",c.shape)
# 输出c中的一些值
print(f"value of c[0,1] is {c[0,1]}\n"
     f"value of c[1,0] is {c[1,0]}\n"
     f"value of c[2,0] is {c[2,0]}\n"
     f"value of c[2,1] is {c[2,1]}\n")
shape of c is (3, 2)
value of c[0,1] is 2
value of c[1,0] is 3
value of c[2,0] is 5
value of c[2,1] is 6
# 创建一个 2x3 的零数组
d = np.zeros((2,3))
print(d)
[[0. 0. 0.]
 [0. 0. 0.]]
# 创建一个 4x2 的一数组
e = np.ones((4,2))
print(e)
[[1. 1.]
 [1. 1.]
 [1. 1.]
 [1. 1.]]
# 创建一个 2x2 的常数数组
f = np.full((2,2),9)
print(f)
[[9 9]
 [9 9]]
# 创建一个 3x3 的随机数组
g = np.random.random((3,3))
print(g)
[[0.32201732 0.09812385 0.3043778 ]
 [0.18712426 0.25977987 0.42345547]
 [0.15311809 0.15691524 0.68197072]]

数组索引

# 创建一个 3x4 的数组
h = np.array([[1, 2, 3, 4, ], [5, 6, 7, 8], [9, 10, 11, 12]])
print(h)
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
# 将数组切片为一个 2x2 的子数组
i = h[:2, 1:3]
print(i)
[[2 3]
 [6 7]]
print(h[0,1])
2
## 修改切片子数组
i[0,0] = 1738
print(h[0,1])
1738

数组中的数据类型

  • Integer
j = np.array([1, 2])
print(j.dtype)
int32
  • Float
k = np.array([1.0, 2.0])
print(k.dtype)
float64
  • Force Data Type
l = np.array([1.0, 2.0], dtype = np.int64)
print(l.dtype)
int64

数组数学计算

基础的数学函数在数组上进行元素操作,既可以使用运算符,也可以使用 NumPy 中的函数

x = np.array([[1, 2], [3, 4]], dtype = np.float64)
y = np.array([[5, 6], [7, 8]], dtype = np.float64)
# 使用运算符相加
print(x + y)
# 使用 add 函数相加
print(np.add(x, y))
[[ 6.  8.]
 [10. 12.]]
[[ 6.  8.]
 [10. 12.]]
print(x - y)
print(np.subtract(x, y))
[[-4. -4.]
 [-4. -4.]]
[[-4. -4.]
 [-4. -4.]]
print(x * y)
print(np.multiply(x, y))
[[ 5. 12.]
 [21. 32.]]
[[ 5. 12.]
 [21. 32.]]
print(x / y)
print(np.divide(x, y))
[[0.2        0.33333333]
 [0.42857143 0.5       ]]
[[0.2        0.33333333]
 [0.42857143 0.5       ]]
print(np.sqrt(x))
[[1.         1.41421356]
 [1.73205081 2.        ]]
x = np.array([[1, 2],[3, 4]])
print("the sum of x is", np.sum(x))
the sum of x is 10
print("the sum of the line of x is",np.sum(x, axis = 0))
the sum of the line of x is [4 6]
print("the sum of the row of x is",np.sum(x, axis = 1))
the sum of the row of x is [3 7]
print("the mean of x is",np.mean(x))
the mean of x is 2.5
print("the mean of the line of x is",np.mean(x, axis = 0))
the mean of the line of x is [2. 3.]
print("the mean of the row of x is",np.mean(x, axis = 1))
the mean of the row of x is [1.5 3.5]

Scipy

NumPy 提供了一个高性能的多维数组和基本工具来计算和操作这些数组 SciPy 在此基础上,提供了大量操作 NumPy 数组的函数,对不同类型的科学和工程应用都很有用 本部分主要使用 SciPy.Stats

SciPy.Stats

  • 包含了大量的概率分布以及不断增长的统计函数库
  • 离散和连续分布(正态分布、均匀分布、二项式分布)
  • 描述性统计学
  • 统计学检验(T检验)
from scipy import stats
import numpy as np
# 输出随机正态分布变量
print(stats.norm.rvs(size = 10))
[-2.10796347 -0.88005629 -1.06571554  1.71270195 -0.11937907 -0.48848505
  0.15752944  1.70043653 -0.36078477 -0.91299862]
from pylab import *
# 创建一些测试数据
dx = .01
X = np.arange(-2, 2, dx)
print(X.shape)
Y = exp(-X ** 2)
print(Y.shape)
(400,)
(400,)

X=[2,1.99,1.98,...,1.99]X = [-2, -1.99, -1.98, ... , 1.99]

Y=eX2Y = e^{-X^2} 是函数 f(X)=eX2f(X)=e^{-X^2}2,1.99,1.98,...,1.99-2, -1.99, -1.98, ... , 1.99 处的值

那么,dxYdx \cdot Y 实际上是在 [2,2][-2, 2] 下,以 0.010.01 为宽、以 YY 为高的所有小长方形的面积

那么 (dxY).sum()(dx \cdot Y).sum() 写作数学公式即为 dxY\sum{dx\cdot Y},换言之,函数 f(X)=eX2f(X)=e^{-X^2}[2,2][-2, 2] 下的近似面积

# 将数据标准化,使得 y 从 -2 到 2 的积分为1
Y /= (dx * Y).sum()

S=(dxY).sum()S = (dx \cdot Y).sum() 为,那么 22YSdxYdxYdx\int_{-2}^{2}{\frac{Y}{S}dx} \approx \frac{\int{Ydx}}{\int{Ydx}} = 1

# CY 即为 t 时刻的积分
CY = np.cumsum(Y * dx)

按照定义,CY[i]Y 从第 0 个元素到第 i 个元素的和。对应的数学公式为:

CY(t)=2tYSdxCY(t) = \int_{-2}^{t}{\frac{Y}{S}dx}

t=2t = -2 时,CY(t)=0CY(t) = 0;当 t=2t = 2 时,CY(t)=1CY(t) = 1

# 画图
plot(X, Y)
plot(X, CY,"r--")
show()
Y 与 CY 的图像
print(stats.norm.cdf(np.array([1, -1., 0, 1, 3, 4, -2, 6])))
[0.84134475 0.15865525 0.5        0.84134475 0.9986501  0.99996833
 0.02275013 1.        ]

描述性统计

np.random.seed(282629734)
# 生成 1000 个随机的连续的T分布变量
x = stats.t.rvs(10, size = 1000)
# 进行一些描述性统计
print("the min of x is",x.min())
print("the max of x is",x.max())
print("the mean of x is",x.mean())
print("the var of x is",x.var())
stats.describe(x)
the min of x is -3.7897557242248197
the max of x is 5.263277329807165
the mean of x is 0.014061066398468422
the var of x is 1.288993862079285

DescribeResult(nobs=1000, minmax=(-3.7897557242248197, 5.263277329807165), mean=0.014061066398468422, variance=1.2902841462255106, skewness=0.21652778283120955, kurtosis=1.055594041706331)

MatPlotLib

MatPlotLib 是一个绘图库

import numpy as np
import matplotlib.pyplot as plt
# 计算正弦曲线上各点的x和y坐标
x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x)
# 画图
plt.plot(x, y)
plt.show()
png
# 计算正弦和余弦曲线上各点的x和y坐标
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)
# 画图
plt.plot(x, y_sin)
plt.plot(x, y_cos)
plt.xlabel("x axis label")
plt.ylabel("y axis label")
plt.title("Sin and Cos")
plt.legend(['sin', 'cos'])
plt.show()
png

Subplots

import numpy as np
import matplotlib.pyplot as plt
# 计算正弦和余弦曲线上个点的 x 和 y 坐标
x = np.arange(0, 3* np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)
# 设置一个高 2 、宽 1 的子图网格,并将这个子图设置为active
plt.subplot(2, 1, 1)
# 针对第一个子图
plt.plot(x, y_sin)
plt.title("sin")
# 针对第二个子图
plt.subplot(2, 1, 2)
plt.plot(x, y_cos)
plt.title("cos")
plt.show()
png

Seaborn

Seaborn 是 MatPlotLib 的补充,专门针对统计数据的可视化,扩展了 MatPlotLib 的功能,使可视化的生成更加方便

MatPlotLib 是一个强大的解决方案,可以解决各种问题,而 Seaborn 则利用更简洁的paramesters来方便使用

Scatterplotsm

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
url = "Cartwheeldata.csv"
df = pd.read_csv(url)
sns.lmplot(x = "Wingspan", y = "CWDistance", data = df)
plt.show()
png
sns.lmplot(x = "Wingspan", y = "CWDistance", data = df,
          fit_reg = False,
          hue = "Gender")
plt.show()
png
sns.swarmplot(x="Gender", y="CWDistance", data=df)
plt.show()
png

Boxplots

sns.boxplot(data=df.loc[:, ["Age", "Height", "Wingspan", "CWDistance", "Score"]])
plt.show()
png
# 男性箱型图
sns.boxplot(data=df.loc[df['Gender'] == 'M', ["Age", "Height", "Wingspan", "CWDistance", "Score"]])
plt.show()
png
# 女性箱型图
sns.boxplot(data=df.loc[df['Gender'] == 'F', ["Age", "Height", "Wingspan", "CWDistance", "Score"]])
plt.show()
png
# 男性 Score 箱型图
sns.boxplot(data=df.loc[df['Gender'] == 'M', ["Score"]])
plt.show()
png
# 女性 Score 箱型图
sns.boxplot(data=df.loc[df['Gender'] == 'F', ["Score"]])
plt.show()
png

直方图

sns.distplot(df.CWDistance)
plt.show()
png

计数

sns.countplot(x='Gender', data=df)
plt.xticks(rotation=-45)
plt.show()
png