科学计算Numpy

科学计算的容器:

1. Numpy array数组

2. TensorFlow, PyTorch, PaddlePaddled tensor张量

科学计算的算法 :统计学指标

# 随机数
import random

# 标准写法
scores = []
for _ in range(10):
 scores.append(random.randint(a=0, b=100))

# 列表解析式
scores1 = []
random.seed(0)
scores1 = [random.randint(a=0, b=100) for _ in range(10)]

# numpy
import numpy as np
# Create an array.
scores2 = np.array(scores)

print(type(scores),type(scores1),type(scores2))

np.array([[1,2,3],[4,5,6]]).ndim # 维度
# 10个学生,每个学生 3门课
scores = np.random.randint(low=0, high=101, size=(10, 3))
print(scores.shape) # 形状
print(scores.dtype) # 数据类型,默认int32
print(scores.size) # 大小
scores.reshape((1, 2, 5, 3)) # 变化数组形状
scores.astype(np.float32) # 强转类型
a = 2.0 # 浮点数规范写法
np.random.seed(1) # seed 种子,种子一样 结果一样,可验证用
scores = np.random.randint(low=0, high=101, size=10)
# 匿名函数
subtract = lambda a, b : a - b
# numpy向量计算
scores + 2
subtract(scores, 2)

数据的结构

  • 标量:scalar,单个数字 3, 199
  • 矢量:vector,
  • 向量,一行/列数 [12, 43, 76, 44]
  • 矩阵:matrix,矩阵,数表,成行成列,m行n列
  • 张量:tensor,高维数组,很多个轴,维度
  • 按维度办事

向量

  • 一系列的数字,摆成一行或是一列,就是一个向量
  • 图形化表示:有方向的线段
  • 坐标化表示:建立坐标系,把向量投影到坐标轴上,得到相关的坐标 a:(3, 6) b:(-8, 4)
  • 模:向量的大小 两个向量的夹角
  • 向量的点乘积: 
向量运算
  • elementwise: 对位操作
    • α = [x1, x2,…, xn]
    • β = [y1 , y2 ,…, yn]
    • α × β = [x1y1 , x2y2 ,…, xnyn]
  • vector: 矢量计算
  • 线性代数
    # NumPy中的线性代数工具箱
    # linear algebra
    np.linalg.norm(a)
    
    """
     余弦相似度:一种用于衡量两个向量之间相似度的方法
     # 两个向量有相同的指向时,余弦相似度的值为1;
     # 两个向量夹角为90°时,余弦相似度的值为0;
     # 两个向量指向完全相反的方向时,余弦相似度的值为-1
    """
    cosine_similarity = a @ b / np.linalg.norm(a) / np.linalg.norm(b)
    cosine_similarity
    
    """
     按维度来定义处理
    """
    # 教委主任[学校, 班级, 学生, 科目]
    np.random.seed(0)
    scores = np.random.randint(low=0, high=101, size=(8, 4, 30, 3)
    
    """
     按维度来处理数据
     - 索引和切片
     - 更复杂的索引和切片
    """
    # 把第 3 所学校的所有数据取出来
    scores[2,:, :, :]
    # 把所有的语文成绩取出来
    scores[:, :, :, 0]
    # 把所有学校的二班成绩都取出来
    scores[:, 1, :, :]
    # 所有学生的语文平均分
    (scores[:, :, :, 0]).mean()
    # 返回最大值的索引
    (scores[:, :, :, 0]).argmax()
    
a = np.array([1,2,3])
np.sqrt((a ** 2).sum(axis=0))

b = np.array([4, 5, 6])
print(a + b)
print(a - b)
print(a / b)
print("手动算内积:")
print((a * b).sum(axis=0))
print("向量的点乘积:")
print(a @ b) # 1*4 + 2*5 + 3*6
print(a.dot(b))
print(b.dot(a))
print(np.dot(a, b))
print("开根号:")
print(np.sqrt(a))
print(np.abs(a))
print("向量的模:")
print(np.sqrt((a ** 2).sum()))
print(np.sin(a))
print("欧氏距离,N维空间内两点的直线距离:")
np.sqrt(((a - b)**2).sum())
"""
 标准差
"""
a = (scores[:, :, :, 0])
# 手动计算
np.sqrt(((a - a.mean()) ** 2).mean())
# 函数计算
a.std()

# 方差
((a - a.mean()) ** 2).mean()
a.var()

# 标准差
np.sqrt(a.var())
# 切片计算
# [students, subjects] 50个学生3门课
scores = np.random.randint(low=0, high=101, size=(50, 3))
# 第3号同学的三门课 第 2 门课
scores[2, 1]
# 找出所有语文及格,但是英语挂科的同学
condition = (scores[:, 0] >= 60) & (scores[:, -1] < 60)
scores[condition, :]
# 所有学生,所有科目的平均分 
scores.mean()
# 所有学生,每门课的平均分
scores.mean(axis=0)
# 每个学生的平均分
scores.mean(axis=1)
# 每门课的标准差
scores.std(axis=0)

 Numpy 广播机制

  • broadcast 广播机制
  • vector + number
  • 原则:在不引起歧义的情况下,通过自身简单的行或列的复制即可对齐形状,从在进行对位计 算!!
  • stack 堆叠
  • concatenate 拼接
  • sequence 序列

a = np.random.randint(low=0, high=101, size=5)
b = np.random.randint(low=0, high=101, size=(2, 5))
c = np.random.randint(low=0, high=101, size=(2, 1))
print(a,b,c,sep='\n')

a + b

a + c

# Join a sequence of arrays along a new axis.
# 沿新轴连接数组 stack
np.stack(arrays=(c, c), axis=1)

# Join a sequence of arrays along an existing axis.
# 沿着现有的轴连接数组 concatenate
np.concatenate((c, c), axis=0)

 数据预处理

  • 基本的索引和切片,跟list类似!!!
  • 数据分析三剑客:
  1. NumPy 科学计算
  2. Pandas 二维表分析神器
  3. Matplotlib 数据可视化

"""
 读取原始数据
"""
X = []
y = []
with open(file="iris.csv", mode="r", encoding="utf8") as f:
 f.readline()
 for line in f:
 line = line.strip().split(",")
 features = [float(ele) for ele in line[:-1]]
 label = int(line[-1])
 X.append(features)
 y.append(label)
X = np.array(X)
y = np.array(y)
# 求出每一个特征的均值
X.mean(axis=0)
# 每一个特征的标准差
X.std(axis=0)
# 每一个特征的最大值
X.max(axis=0)
# 每一个特征的最小值
X.max(axis=0)
from matplotlib import pyplot as plt
x0 = X[:,0]
# 折线图 plot
# 散点图 scatter
plt.plot(x0)

科学计算Numpy_第1张图片

plt.scatter(x0,y)

 科学计算Numpy_第2张图片

# 提取基本参数
_mean = X.mean(axis=0)
_std = X.std(axis=0)
_min = X.min(axis=0)
_max = X.max(axis=0)

# 同时把4个特征做规范化
X1 = (X - _mean) / _std

# 同时把 4 个特征做归一化 MinMax: [0, 1]
X2 = (X - _min) / (_max - _min)

你可能感兴趣的:(numpy,python,matplotlib)