numpy(Numerical Python的简称)是高性能科学计算和数据分析的基础包。其部分功能如下:
ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++、Fortran等语言编写的代码的工具。
# 创建ndarray
import numpy as np
data = [1, 2, 3, 4]
arr = np.array(data)
print(arr)
print(type(arr))
# 创建全0全1或没有任何具体值的数组
arr_zero = np.zeros((2,2))
print(arr_zero)
print(arr_zero.dtype)
print(type(arr_zero))
arr_one = np.ones((2,2))
print(arr_one)
print(arr_one.dtype)
arr_empty = np.empty((2,2))
print(arr_empty)
print(arr_empty.dtype)
# 创建随机数组
arr1 = np.random.rand(2,2) # 创建指定形状的数组(范围在0至1之间)
arr2 = np.random.uniform(0,10) # 创建指定范围内的一个数
arr3 = np.random.randint(0,10) # 创建指定范围内的一个整数
arr4 = np.random.normal(0.5, 0.1, (2,2)) # 给定均值/标准差/维度的正态分布
print('arr1:', arr1)
print('arr2:', arr2)
print('arr3:', arr3)
print('arr4:', arr4)
# 查看ndarray的常用属性
print(arr4.size) # 数组元素个数
print(arr4.shape) # 数组形状
print(arr4.ndim) # 数组维度
print(arr4.dtype) # 数组元素类型
# 数组和标量之间的运算
# 我们不用编写循环即可对数据执行批量运算。这通常叫做矢量化(vectorization)。大小相等的数组之间的任何算术运算都会将运算应用到元素级。同样,数组与标量的算术运算也会将那个标量值传播到各个元素。
arr = np.array([[1, 2], [3, 4], [5, 6]])
print('arr + arr = ', arr + arr)
print('arr - arr = ', arr - arr)
print('arr * arr = ', arr * arr)
print('arr / arr = ', arr / arr)
print('arr + 1 = ', arr + 1)
print('arr - 1 = ', arr - 1)
print('arr * 2 = ', arr * 2)
print('arr / 2 = ', arr / 2)
print('1 / arr = ', 1 / arr)
print('arr ** 2 = ', arr**2)
# 数组的索引和切片
# 跟列表最重要的区别在于,数组切片是原始数组的视图。这意味着数据不会被复制,视图上的任何修改都会直接反映到源数组上
# 将一个标量值赋值给一个切片时,该值会自动传播到整个选区
arr = np.arange(10)
print(arr)
print(arr[2:7])
arr_slice = arr[4:8]
arr_slice[:] = 20
print(arr)
# 数学和统计方法
# 可以通过数组上的一组数学函数对整个数组或某个轴向的数据进行统计计算
# sum、mean以及标准差std等聚合计算既可以当做数组的实例方法调用,也可以当做顶级Numpy函数使用
arr = np.random.randn(2,3)
print(arr)
print(np.mean(arr))
print(arr.mean())
print(arr.sum())
print(arr.std())
# mean 和 sum 这类的函数可以接受一个 axis 参数(用于计算该轴向上的统计值),最终结果是一个少一维的数组
print(arr.mean(axis=1))
print(arr.mean(axis=0))
print(arr.sum(0))
# cumsum 和 cumprod 之类的方法则不聚合,而是产生一个由中间结果组成的数组
print(arr.cumsum(0))
print(arr.cumprod(1))
# 矩阵乘法
# numpy提供了一个用于矩阵乘法的dot函数(既是一个数组方法,也是numpy命名空间中的一个函数)
x = np.array([[1,2],[3,4]])
y = np.array([[5,6],[7,8]])
print(np.dot(x,y))
print(x.dot(y))
numpy.linalg 中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的东西
import numpy as np
# 创建一个对角矩阵
arr=np.array([1,2,3])
matrix=np.diag(arr)
print("matrix:",matrix)
# 从方阵中提取对角线元素
square_matrix = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
matrix = np.diag(square_matrix)
print("matrix:",matrix)
import numpy as np
matrix1 = np.array([[1, 2], [3, 4]])
matrix2 = np.array([[5, 6], [7, 8]])
# 计算两个二维数组的矩阵乘积
matrix_product = np.dot(matrix1, matrix2)
print(matrix_product)
matrix = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 使用 numpy.trace 计算矩阵的迹
trace_value = np.trace(matrix)
print(trace_value)
import numpy as np
A=np.array([[4,1],[2,3]])
det_A=np.linalg.det(A)
print(det_A)
values,vectors=np.linalg.eig(A)
print(values)
print(vectors)
# 注意:只有方阵才有逆矩阵,且行列式不能为0
if np.linalg.det(A) != 0:
inv_A = np.linalg.inv(A)
print("A的逆矩阵:")
print(inv_A)
else:
print("A没有逆矩阵,因为它的行列式为零。")
import numpy as np
# 创建一个系数矩阵A(方阵)和一个目标向量b
A = np.array([[1, 2], [3, 4]])
b = np.array([7, 8])
# 使用solve解线性方程组 Ax = b
x_solve = np.linalg.solve(A, b)
print("解线性方程组 Ax = b 的解是:")
print(x_solve)
# 使用lstsq解决过定方程组
x_lstsq, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None)
print("使用最小二乘法求解过定方程组的解是:")
print(x_lstsq)
pandas是python第三方库,提供高性能易用数据类型和分析工具 pandas基于numpy实现,常与numpy和matplotlib一同使用 pandas中有两大核心数据结构:Series(一维数据) 和 DataFrame(多特征数据,既有行索引,又有列索引)
Series
index | name |
---|---|
0 | xiaoming |
1 | xiaohong |
2 | xiaobai |
DataFrame
index | name | age | score |
---|---|---|---|
0 | xiaoming | 21 | 99 |
1 | xiaohong | 20 | 80 |
2 | xiaobai | 22 | 100 |
#Series是一种类似于一维数组的对象,它由一维数组(各种numpy数据类型)以及一组与之相关的数据标签(即索引)组成
#Series的创建:
# 使用Python数组创建
# 使用numpy数组创建
# 使用python字典创建
# 与字典不同的是:Series允许索引重复
import pandas as pd
import numpy as np
pds1 = pd.Series([99, 98], index=['xiaoming', 'xiaohong'])
print(pds1)
pds2 = pd.Series(np.arange(3,6))
print(pds2)
pds3 = pd.Series({'name': 'xiaoming', 'age': 21, 'score': 99})
print(pds3)
# Series的字符串表现形式为:索引在左边,值在右边
# 如果没有为数据指定索引,则自动创建一个0到N-1(N为数据的长度)的整数型索引
# 可以通过Series的values和index属性获取其数组表示形式和索引对象
# 与普通numpy数组相比,可以通过索引的方式选取Series中的单个或一组值
pds = pd.Series([1, 2, 3, 4])
print(pds.values)
print(pds.index)
print(pds[1])
pds[2] = 10
print(pds[[1,2]])
# Series中最重要的一个功能是:它会在算术运算中自动对齐不同索引的数据
stu1 = pd.Series({'math': 100, 'physics': 98, 'chemistry': 90})
stu2 = pd.Series({'math': 95, 'physics': 96, 'chemistry': 94})
print(stu1 + stu2)
# DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)
# DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)
# 跟其他类似的数据结构相比(如R语言的data.frame),DataFrame中面向行和面向列的操作基本上是平衡的
# DataFrame中的数据是以一个或多个二维块存放的(而不是列表、字典或别的一维数据结构)
data = {'name': ['xiaoming', 'xiaohong', 'xiaobai'], 'score': [100, 99, 98]}
fr = pd.DataFrame(data)
print(fr)
# 可以按照指定的列顺序创建DataFrame
fr = pd.DataFrame(data, columns=['score', 'name'])
print(fr)
# DataFrame的每一列都可以作为一个Series进行输出
print(fr['name'])
print(type(fr['name']), type(fr['score']))
# 可以给DataFrame创建或修改列的值
fr['age'] = [21,22,20]
print(fr)
fr.loc[1, 'age'] = 30
print(fr)
# values属性会以二维ndarray的形式返回DataFrame中的数据
fr.values
PIL库是一个具有强大图像处理能力的第三方库 在命令行下的安装方法:pip install pillow 在使用过程中的引入方法:from PIL import Image Image 是 PIL 库中代表一个图像的类(对象) 图像是一个由像素组成的二维矩阵,每个元素是一个RGB值
# 读取图片
from PIL import Image
import numpy as np
img = Image.open('work/cat.jpg')
print(img)
arr = np.array(img)
print(arr.shape)
print(arr)
img.show() # 本地电脑上可以用该命令调用系统的图片显示工具显示图片
import matplotlib.pyplot as plt
plt.imshow(img)
# PIL中还有
dog = Image.open('work/dog.jpg')
plt.imshow(dog)
cat = img.resize((400,300))
dog = dog.resize((400,300))
Image.blend(cat,dog,0.3)
# 图片的灰度化处理
gray_cat = cat.convert('L')
plt.imshow(gray_cat)
# 获取图片的基本信息
bands = cat.getbands() # 显示该图片的所有通道
print(bands)
bbox = cat.getbbox() # 获取图片左上角和右下角的坐标
print(bbox)
width, height = cat.width, cat.height # 获取图片宽度和高度
print(width, height)
# 图片粘贴操作
flower = Image.open('work/flower.jpg')
flower.paste(dog)
plt.imshow(flower)
flower.paste(dog, (300, 300))
plt.imshow(flower)
Matplotlib库由各种可视化类构成,内部结构复杂。 受Matlab启发,matplotlib.pylot是绘制各类可视化图形的命令字库,相当于快捷方式。
# plt.plot() 只有一个输入列表或数组时,参数被当做Y轴,X轴以索引自动生成
# plt.savefig() 将输出图形存储为文件,默认PNG格式,可以通过dpi修改输出质量
import matplotlib.pyplot as plt
plt.plot([3, 2, 5, 8, 10, 6])
plt.xlabel('Time')
plt.ylabel('Meter')
plt.savefig('work/graph', dpi=300)
plt.show()
#subplot在全局绘图区域中创建一个分区体系,并定位到一个子绘图区域
plt.figure()
plt.subplot(231)
plt.plot([1,2,3])
plt.subplot(232)
plt.plot([1,2,1])
plt.subplot(233)
plt.plot([2,2,1])
plt.subplot(212)
plt.plot([1,2,1,3,4,5])
# 饼图的绘制
labels = 'apple', 'banana', 'orange', 'peach'
sizes = [3, 5, 6, 2]
explode = (0, 0, 0.2, 0)
plt.pie(sizes, explode=explode, labels=labels, startangle=90)
plt.axis('equal')
plt.show()
# 直方图的绘制
np.random.seed(0)
mu, sigma = 10, 2 # 均值和标准差
a = np.random.normal(mu, sigma, size=10)
plt.hist(a, 20)
plt.title('Histogram')
plt.show()
# 散点图的绘制
plt.plot(10*np.random.randn(100), 10*np.random.randn(100), 'o')
plt.title('Simple Scatter')
plt.show()