▍▍▍『1』NumPy 简介
前面,我们讲述了 Python 的基础知识等,但关于科学计算的部分较少提及。从这一篇开始,讲述基本科学计算包的使用。
解释性语法所写的数学算法通常远比编译型来得慢,而且 Python 对于矩阵的运算极不友好,没有各种运算函数,也不适合做数值运算。鉴于此,NumPy 闪亮登场。
最早,Jim HugUNin 大神开发了Numeric 和 Numarray,也就是 NumPy 的前身。2005 年,Travis Oliphant 通过将 Numarray 的功能集成到 Numeric 包中来创建了 NumPy 包。
NumPy 是 Python 语言的一个扩展程序库,是一个运行速度非常快的数学库,主要用于数组计算。它可以让你在 Python 中使用向量和数学矩阵,以及许多用 C 语言实现的底层函数,你还可以体验到从未在原生 Python 上体验过的运行速度。毫不客气的说,NumPy 是 Python 在科学计算领域取得成功的基石。它的核心功能是一个具有矢量运算和复杂的广播能力的多维数组,该数组由同类型的数据组成。使用 NumPy,我们可以很方便地执行以下操作:
- 标准数学函数运算;
- 实用的线性代数,傅里叶变换和随机数生成。
▍▍▍『2』NumPy 安装
可以使用 Python 包安装程序 pip
来安装 NumPy。
pip install numpy
▍▍▍『3』NumPy 使用
♢♢♢ndarray 数据结构
ndarray 是 Numpy 中的数据结构,具有以下特点:
- 多维度;
- 同质,即元素类型相同,每个元素在内存中使用相同大小的块;
- 固定大小,数组大小不会发生改变。
它的维度称为 axes,类似于坐标系几个轴代表几维一样;每个维度上的元素个数称为 rank,类似于线性代数中秩的概念,除此之外,ndarray 对象的一些重要属性如下:
ndarray.ndim # 维数
ndarray.shape # 每个维度的 rank 组成的元组,如二维数组 (m,n)
ndarray.size # 元素总和
ndarray.dtype # 数据类型
ndarray.itemsize # 每个元素占字节数
♢♢♢创建数组
ndarray 通过内置函数创建,主要方法有:
np.array()
:接受 Python 序列,序列而不是多个元素,转换为 ndarray;
import numpy as np
a = np.array([1, 2, 3]) # 一维
b = np.array([[1,2,3],[4,5,6]]) # 二维
np.zeros()/np.ones()/np.eye()/np.full()/np.random.random()/np.empty()
;
a = np.zeros((2,2)) # 2*2 全0数组
b = np.ones((1,2)) # 1*2 全1数组
c = np.eye(2) # 2 阶对角矩阵,对角线为 1
d = np.full((2,2), 7) # 2*2 全常数数组
e = np.random.random((2,2)) # 2*2 随机数数组
g = np.empty((2,3)) # 2*3 未初始化数组
np.arange()/np.linspace()/np.logspace()
。
# 指定开始、终值、步长创建一维数组
a = np.arange(0, 2, 0.3)
# 指定开始、终值、个数创建一维等差数列数组
b = np.linspace(0, 2, 9)
# 指定开始、终值、个数创建一维等比数列数组
c = np.logspace(0, 2, 9)
♢♢♢访问数组
♢切片
和 Python 列表类似,ndarray 可以使用切片语法。因为数组可以是多维的,所以你得为每个维度指定好切片。
# 创建 3*4 的二维数组
# [[ 1 2 3 4]
# [ 5 6 7 8]
# [ 9 10 11 12]]
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
# 切片 2*2 二维数组:
# [[2 3]
# [6 7]]
b = a[:2, 1:3]
# 切片一个元素
c = a[1, 1]
♢布尔索引
选取数组中满足条件的任意元素,返回一维数组。
a = np.array([[1,2], [3, 4], [5, 6]])
b = a[a>2] # [3, 4, 5, 6]
♢where 函数
与布尔索引类似,根据条件返回数组中的元素。
b = a[a>2] # [3, 4, 5, 6]
b = np.where(a>2) # [3, 4, 5, 6]
♢♢♢基本运算
仅仅会赋值、取值和得到一些属性是不能满足你的需求的,有时候你还需要做一些数学运算。基本的数学运算可以用操作符实现:
a + b
a - b
a * b
a / b
a**2 # a 平方
np.sqrt(a) # a 开根号
a < b
这些操作符都是对数组进行逐元素运算,即每一个元素配对进行计算,返回同大小的数组。
NumPy 还提供了一些其他很有用的操作符,用于处理数组。
a.sum()
a.min()
a.max()
a.dot(b) # 矩阵点乘
np.sin(a)
np.exp(a)
更多相关操作可以查看 NumPy 的 Universal functions。
♢♢♢其他相关
这里记录一下可能需要注意和学习的知识,如果感兴趣的话可自行学习,大体上数据分析方面很少用到这方面知识。
♢不拷贝、浅拷贝、深拷贝
简单的赋值不会拷贝任何数组对象和它们的数据,下面例子中 a
和 b
是同一个东西,b
修改 a
也会修改。
a = np.arange(12)
b = a
浅拷贝创建了一个相同数据的新数组对象,下面例子中 a
和 b
不是同一个东西,但数据相同,b
修改 a
也会修改。
a = np.arange(12)
b = a.view()
深拷贝创建一个新数组,b
修改 a
不会修改。
a = np.arange(12)
b = a.copy()
♢广播
ndarray 具有广播功能,即不同形状的数组可以进行运算,广播规则略。
♢线性代数及其他
NumPy 可以做部分线性代数,基本没用过,略。
从零单排09:NumPymp.weixin.qq.com想一起学习数据科学的同学,可以搜索公众号 “data2nb” 关注 “从零单排数据分析”,一步一步的记录自己的学习历程,可供入门迷茫者参考。可以点击下边链接查看公众号。:-D