目录
一、运用Python进行向量、矩阵运算
1.导入相应的库
import numpy as np
# numpy: 科学计算基本库;提供高效的N维数组和向量运算。
# Numerical Python的简写。
2. 举例:计算矩阵内积XY
matrix是array的分支,很多时候是通用的,但官方建议是选择array更好,因为array更灵活,速度更快。matrix的优势是相对简单的运算符号。比如两个矩阵相乘,就是用符号*,但是array相乘不能这么用,得使用.dot()
# np.dot(X, Y),矩阵内积: XY
A = np.array([[1., 2., 3.], [4., 5., 6.]])
B = np.matrix([[1., 2., 3.], [4., 5., 6.]])
# array创建数组最简单的办法
# 每个数组都有1个shape(1个表示各维度大小的元组)和
# 1个dtype(1个用于说明数组数据类型的对象)
A.dtype # 返回:dtype('float64')
A.shape # 返回:(2, 3)
print('A = ', A)
B = np.array([[6., 23.], [-1., 7.], [8., 9.]])
print('B = ', B)
A.dot(B) #等价于 np.dot(A, B)
A@B #特殊符号@也可以用于矩阵的内积
# 返回: array([[ 28., 64.],[ 67., 181.]])
#--------------------------------------------------
np.dot(A, np.ones(3)) # np.ones(3) 返回 array([ 1., 1., 1.])
A@np.ones(3)
#特殊符号*表示矩阵的逐元素乘积 A*B,矩阵A、B的维数应一致
A*A
3.创建特殊矩阵
np.zeros([3, 2]) # 全零矩阵
#返回:array([[ 0., 0.],
# [ 0., 0.],
# [ 0., 0.]])
np.identity(3) # 单位阵
#返回:array([[ 1., 0., 0.],
# [ 0., 1., 0.],
# [ 0., 0., 1.]])
np.diag([1, 2, 3]) # 对角阵
#返回:array([[1, 0, 0],
# [0, 2, 0],
# [0, 0, 3]])
4. 矩阵的转置、逆矩阵和特征值
numpy.linalg拥有一个矩阵分解的标准函数集。
- A.T:返回A的转置
- inv(A):返回A的逆矩阵
- eig(A):返回A的特征值和特征向量
from numpy.linalg import inv, eig
#矩阵的逆矩阵 inv
#矩阵的转置 A.T
A = np.array([[1., 2., 3.], [4., 5., 6.]])
A.T # 返回:array([[ 1., 4.],[ 2., 5.],[ 3., 6.]])
A.dot(A.T) # 返回:array([[ 14., 32.],[ 32., 77.]])
C = inv(A.dot(A.T)) # 返回:array([[ 1.42592593, -0.59259259],[-0.59259259, 0.25925926]])
C.dot(A.dot(A.T)) # 返回:array([[ 1., 0.],[ 0., 1.]])
#矩阵特征值和特征向量
eigvalues, eigvectors = eig(C)
# eigvalues返回:array([ 1.67412357, 0.01106162])
# eigvectors返回:array([[ 0.92236578, 0.3863177 ],[-0.3863177 , 0.92236578]])
二、Python介绍
1. 数值表示
# 标量
x = 1
y = 1.
print('Type of x', type(x)) #返回:Type of x <class 'int'>
print('Type of y', type(y)) #返回:Type of y <class 'float'>
# 当在Python中创建变量(或名字),你就在等号右边创建了一个对这个变量的引用。
# 考虑一个整数列表:
a = [1, 2, 3]
# 假设将a赋值给新变量b,c:
b = a
# 假设将a赋值给新变量b,c:
c = b
# a, b, c指向同一个对象
a.append(4)
print('a = ', a)
print('b = ', b)
print('c = ', c)
# 返回:a = [1, 2, 3, 4]
# b = [1, 2, 3, 4]
# c = [1, 2, 3, 4]
2. 文件编码类型
PY文件当中是不支持中文的,即使你输入的注释是中文也不行。为了解决这个问题,就需要把文件编码类型改为UTF-8的类型:
文件开头加上“# -*- coding: UTF-8 -*-”
3. 数据的读取和保存
数据输入路径,可以是文件路径,也可以是 URL(网络地址),或者实现 read 方法的任意对象。
# 数据的读取和保存
import pandas as pd
# pandas: 数据结构和数据分析库。
# 来源于panel data;也是Python Data Analysis的简写短语。
# read_csv: 从文件、URL或文件型对象读取分隔好的数据,逗号是默认分隔符;
# 数据类型:DataFrame
# DataFrame表示的是矩阵的数据表,既有行索引,也有列索引
URL = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
Iris_data = pd.read_csv(URL)
print(Iris_data)
# 函数帮助
help(pd.read_csv)
header: 设置导入 DataFrame 的列名称,默认为 'infer',注意它与下面介绍的 names 参数的微妙关系。
names:当names没被赋值时,header会变成0,即选取数据文件的第一行作为列名。当 names 被赋值,header 没被赋值时,那么header会变成None。如果都赋值,就会实现两个参数的组合功能。
path = "E:\\Work at STU\\Data\\lecture1.csv"
df = pd.read_csv(path, encoding = 'gbk')
print('df =', df)
#返回:df = name age gender
# 0 王二 18 男
# 1 张三 17 女
# 2 李四 16 男
df1 = pd.read_csv(path, header = 0, encoding = 'gbk')
print('df1 =', df1)
#返回:df1 = name age gender
# 0 王二 18 男
# 1 张三 17 女
# 2 李四 16 男
df2 = pd.read_csv(path, header = None, encoding = 'gbk')
print('df2 =', df2)
#返回:df2 = 0 1 2
# 0 name age gender
# 1 王二 18 男
# 2 张三 17 女
# 3 李四 16 男
df3 = pd.read_csv(path, header = 0, names = ["姓名", "年龄", "性别"], encoding = 'gbk')
print('df3 =', df3)
#返回:df3 = 姓名 年龄 性别
# 0 王二 18 男
# 1 张三 17 女
# 2 李四 16 男
df4 = pd.read_csv(path, names = ["姓名", "年龄", "性别"], encoding = 'gbk')
print('df4 =', df4)
#返回:df4 = 姓名 年龄 性别
# 0 name age gender
# 1 王二 18 男
# 2 张三 17 女
# 3 李四 16 男
df5 = pd.read_csv(path, header = 1, names = ["姓名", "年龄", "性别"], encoding = 'gbk')
print('df5 =', df5)
#返回:df5 = 姓名 年龄 性别
# 0 张三 17 女
# 1 李四 16 男
"""
打印列名
"""
print(df.columns) #返回: Index(['name ', 'age ', 'gender'], dtype='object')
print(df.index) #数据标签, 索引(index);
#返回:RangeIndex(start=0, stop=3, step=1)
"""
每个索引都具有集合逻辑的方法和属性;
交集(index1&index2, index1.intersection(index2))、
并集 (index1|index2, index1.union(index2))
差集 (index1-index2, index1.difference(index2))
"""
m, n = df.shape #DataFrame的维数
print('m =', m) #返回:3
print('n =', n) #返回:3
保存数据写入文本格式,使用to_csv函数
header:是否保留列名(True or False)
index: 是否保留行索引(True or False)
# 将数据写入文本格式
path = "E:\\lecture1_2.csv"
df.to_csv(path, index = False, header = True)
⚪编程提示:
- Python使用缩进(Tab或者空格键)来组织代码;四个空格键为默认缩进。
- 一个冒号代表一个缩进代码块的开始,单个代码块中的所有代码必须保持相同的缩进,直到代码块结束。
- Python语句不以分号结尾;分号可以用于在一行内将多条语句之间进行分割。
- 但是不鼓励在Python中将多条语句写成一行,因为这样会使代码可读性下降。