一、numpy版本的发展历程
NumPy是Python语言的一个扩展程序库,支持大量的维度数组和矩阵运算,同时也针对数组进行广播(broadcast)等功能。其诞生的历程也经历了多个版本的变化。
2015年9月,NumPy 1.10发布,增加了索引数组的花式索引,从而支持提取非规则的子数组。NumPy 1.11在2016年4月发布,增强了float96类型,弃用剩余部分,同时增加了很多的特性,例如基于映射支持dtype,NumPy向量,支持逐元素函数的选择和向量化。
接着,NumPy 1.12在2017年1月发布,带来许多改进,如使用minimum/maximum/ufunc.maximum/ufunc.minimum优化 ufunc reduce,对基元pyobject乘法进行了优化,增强了多维排序、Array-Callable ufunc协议、pickle协议,而且增加了一些未公开的API。
截至目前(2021年),NumPy的稳定版本是1.20,而1.21.0 alpha1已经发布,在这一版中,添加了根据最大值或最小值计算 argmax 和 argmin 的函数,同时进行了一些bug修复。
二、numpy版本的重要特性
numpy版本依次发布,每一版都有一些重要的特性或者API。这些特性使得NumPy成为Python中最常用的科学计算库之一。
1.多维数组对象ndarray
import numpy as np
#随机生成一个包含3*2的数组
a = np.random.random((3,2))
print(a)
以上代码用到的ndarray即多维数组对象,是NumPy的一个重要组件。通过ndarray,可以非常方便的进行向量化计算,例如上述代码就是生成了一个包含3*2的随机数组。
2.数组运算和数学函数
import numpy as np
a = np.array([1,2,3,4])
b = np.array([2,3,4,5])
#数组加法
print(a+b)
#数组乘法
print(a*b)
#求平方、三次方、对数等函数
print(np.square(a))
print(np.power(a, 3))
print(np.log(a))
在NumPy中进行数组的运算和数学函数的计算非常简单,只需调用ndarray对象的方法或者NumPy自带的数组运算函数即可。
3.切片和索引
import numpy as np
a = np.random.random((3,2))
#取第一行
print(a[0])
#取第二列
print(a[:,1])
#取右下角元素
print(a[2, 1])
NumPy中针对数组的切片和索引非常灵活,可以方便地对数组中的元素进行选择和处理。
4.数组的形状和大小
import numpy as np
a = np.random.random((3,2))
print(a.shape) # (3,2)
a.shape = (2,3)
print(a)
在NumPy中,可以非常方便地改变数组的形状和大小,从而能够更好地适应不同的计算需求。
5.广播广义函数
import numpy as np
a = np.random.random((3,2))
b = np.array([1,2])
print(a+b)
广播是NumPy中的一个重要特性,它能够让标量和数组进行运算时,自动地将标量扩展成和数组的形状相同,从而避免了大量的循环计算。例如上述代码中,数组a和1维数组b的加法就会自动触发广播运算。
三、numpy版本的应用案例
1.图像处理
NumPy的API非常适合进行图片的读取、处理和转换,例如下述代码就是读取图片进行显示和交互。
import matplotlib.pyplot as plt
from matplotlib.image import imread
#读取图片文件
img = imread('lena.png')
#显示图片
plt.imshow(img)
plt.axis('off')
plt.show()
2.机器学习
NumPy在机器学习领域也有着广泛的应用,例如下述代码是进行逻辑回归模型训练和预测的一个示例。
from sklearn.linear_model import LogisticRegression
import numpy as np
#生成数据集
X_train = np.random.normal(size=(100, 2))
y_train = (X_train[:, 0] > X_train[:, 1]).astype(np.int)
#训练逻辑回归模型
model = LogisticRegression()
model.fit(X_train, y_train)
#进行预测
X_test = np.random.normal(size=(10, 2))
y_test = model.predict(X_test)
print(y_test)
3.数据处理
NumPy提供了许多用于处理数据的函数和API,例如下述代码就是进行矩阵乘法和计算特征值、特征向量的示例。
import numpy as np
#矩阵乘法
a = np.random.normal(size=(3,3))
b = np.random.normal(size=(3,3))
c = np.matmul(a, b)
print(c)
#计算特征值和特征向量
d, e = np.linalg.eig(c)
print(d)
print(e)
四、总结
NumPy作为Python中最常用的科学计算库之一,其版本的升级和特性的改进也在持续的进行中,为科学计算和数据处理提供着良好的支持。