一、python NumPy教程
1.简介
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
2.NumPy Ndarray对象
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。(可以用来组织矩阵)
1)创建Ndarray
直接创建:
matrix2 = np.array([ # 生成矩阵
[1, 2, 3],
[2, 4, 6],
[3, 6, 9],
[4, 8, 12]
])
利用方法创建特殊矩阵-empty/zero/ones. /range(start, stop, step, dtype)
matrix4 = np.zeros((5, 5), dtype=np.int)
print (matrix4)
matrix5 = np.ones((5, 5), dtype=np.int)
print (matrix5)
matrix6 = np.arange(10, 10000, 200)
print (matrix6)
2)数组的属性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SyHDwzWC-1602755542156)(/Users/yuanbao/Library/Application Support/typora-user-images/image-20201014155955603.png)]
数组的维数-NumPy 数组的维数称为秩(rank),秩就是轴的数量,即数组的维度,一维数组的秩为 1,二维数组的秩为 2,以此类推。
matrix3 = np.array([
[
[1, 2, 3]
],
[
[2, 4, 6]
]
])
print (matrix3.ndim)
数组的维度,对于矩阵,n行m列
matrix2 = np.array([ # 生成矩阵
[1, 2, 3],
[2, 4, 6],
[3, 6, 9],
[4, 8, 12]
])
print (matrix2)
print ("row=" + str(matrix2.shape[0]))
print ("col=" + str(matrix2.shape[1]))
print ("elements=" + str(matrix2.size))
3)数组的切片和索引
ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。
# 切片和索引
a1 = matrix7[2:]
print (a1)
a2 = matrix7[2]
print (a2)
a3 = matrix7[2:9:2] # 不包括停止索引
print (a3)
a4 = matrix2[0] # 二维数组是行的序号
print (a4)
a5 = matrix2[..., 1] # 列向量
print (a5)
3.广播机制
广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。
如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。
广播的规则:
对两个数组,分别比较他们的每一个维度(若其中一个数组没有当前维度则忽略),满足:
- 数组拥有相同形状。
- 当前维度的值相等。
- 当前维度的值有一个是 1。
若条件不满足,抛出 “ValueError: frames are not aligned” 异常。
第一段和第二段程序会通过,但第三段程序会报错。
a = np.array([1, 2, 3, 4])
b = np.array([10, 20, 30, 40])
c = a * b
print (c)
a = np.array([[0, 0, 0],
[10, 10, 10],
[20, 20, 20],
[30, 30, 30]])
b = np.array([1, 2, 3])
print(a * b)
a = np.array([[0, 0, 0],
[10, 10, 10],
[20, 20, 20],
[30, 30, 30]])
b = np.array([
[1, 2, 3],
[2, 4, 6]
])
print(a + b)
4.NumPy 矩阵库(Matrix)
NumPy 中包含了一个矩阵库 numpy.matlib,该模块中的函数返回的是一个矩阵,而不是 ndarray 对象。
一个
的矩阵是一个由
行(row)
列(column)元素排列成的矩形阵列。
# coding=utf-8
import numpy.matlib
import numpy as np
matrix = np.arange(20).reshape(4, 5)
p = np.array([1, 1, 1, 1, 1])
matrix = matrix+p
print (matrix)
print ("矩阵的转置为:")
print (matrix.T)
print ("对角矩阵:")
print (np.eye(5, 3))
print ("numpy.matlib.identity() 函数返回给定大小的单位矩阵。")
print (np.matlib.identity(5))
print ("numpy.matlib.rand() 函数创建一个给定大小的矩阵,数据是随机填充的。")
print (np.matlib.rand(3, 2))
5.NumPy 线性代数库linalg
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZPbKbgcz-1602755542162)(/Users/yuanbao/Library/Application Support/typora-user-images/image-20201014162445558.png)]
# 求行列式的值|A|
c = np.array([
[11, 12],
[13, 14]
])
print (np.linalg.det(c))
print
# 解方程
a = np.array([
[1, 5],
[2, 1]
])
b = np.array([
[8],
[7]
])
number = a.shape[0]
i = 0
while i < number:
print ("第"+str(i+1)+"个变量的值为:")
print (np.linalg.solve(a, b)[i][0])
i = i+1
# 求矩阵的逆
c = np.array([
[11, 12],
[13, 14]
])
print (np.linalg.inv(c))
6.Numpy I/O函数
Numpy 可以读写磁盘上的文本数据或二进制数据。
NumPy 为 ndarray 对象引入了一个简单的文件格式:npy。
npy 文件用于存储重建 ndarray 所需的数据、图形、dtype 和其他信息。
常用的 IO 函数有:
- load() 和 save() 函数是读写文件数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npy 的文件中。
- savez() 函数用于将多个数组写入文件,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npz 的文件中。
- loadtxt() 和 savetxt() 函数处理正常的文本文件(.txt 等)
a = np.array([
[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7]
])
# 保存到 outfile.npy 文件上
np.save('outfile.npy', a)
# 保存到 outfile2.npy 文件上,如果文件路径末尾没有扩展名 .npy,该扩展名会被自动加上
np.save('outfile2', a.T)
# 当直接查看文件时,文件是乱码的,因为它们是 Numpy 专用的二进制格式后的数据。
# 我们可以使用 load() 函数来读取数据就可以正常显示了:
b = np.load('outfile2.npy')
print (b)
a = np.array([1, 2, 3, 4, 5])
np.savetxt('out.txt', a)
b = np.loadtxt('in.txt')
print(b)
NumPy Matplotlib Python 的绘图库
Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。 它也可以和图形工具包一起使用,如 PyQt 和 wxPython。