一、NumPy库概述
NumPy库是一个开源的python科学计算基础库,底层实现是由C语言实现的,运算快速高效。
- 一个强大的N维数组对象 ndarray
- 广播功能函数
- 整合C/C++/Fortran代码的工具
- 线性代数、傅里叶变换、随机数生成等功能
NumPy是Scipy、Pandas等数据处理或科学计算库的基础
二、NumPy库的安装
在命令行cmd中使用pip工具安装即可。
pip install numpy
三、NumPy库的引用
约定:
import numpy as np
引用简单且便于识别。
四、N维数组对象:ndarray
4.1 简要介绍
ndarray是一个多维数组对象,由两部分组成:
- 实际的数据
- 描述这些数据的元数据(数据维度、数据类型等)
ndarray数组一般要求所有元素类型相同(同质),数组下标从0开始
4.2 作用
-
Q:Python已有列表类型,为什么需要一个数组对象(类型)?
def pySum(): a = [0,1,2,3,4] b = [5,6,7,8,9] c = [] for i in range(len(a)): c.append(a[i] ** 2 + b[i] ** 3) return c print(pySum())
对比👇
import numpy as np def pySum(): a = np.array([0,1,2,3,4]) b = np.array([5,6,7,8,9]) c = a ** 2 + b ** 3 return c print(npSum())
数组对象的优势:
- 数组对象可以去掉元素间运算所需的循环,使一维向量更像单个数据
- 设置专门的数组对象,经过优化,可以提升这类应用的运算速度
- 数组对象采用相同的数据类型,有助于节省运算和存储空间
4.3 引例
>>> import numpy as np
>>> a = np.array([[0,1,2,3,4],[5,6,7,8,9]]) # 生成一个ndarray数组
>>> a
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
>>> print(a) # 输出成[]形式,元素由空格分隔
[[0 1 2 3 4]
[5 6 7 8 9]]
轴(axis):保存数据的维度
秩(rank):轴的数量
4.4 ndarray 对象的属性
-
np.ndim —— 秩,即轴的数量或维度的数量
-
np.shape —— ndarray 对象的尺度,对于 mxn 矩阵,为 n 行 m 列
-
np.size —— ndarray 对象元素的个数,相当于 .shape 中 n*m 的值
-
np.dtype —— ndarray 对象的元素类型
-
np.itemsize —— ndarray 对象中每个元素的大小,以字节为单位
e.g.
>>> import numpy as np
>>> a = np.array([[0,1,2,3,4],[5,6,7,8,9]])
>>> a.ndim
2
>>> a.shape
(2, 5)
>>> a.size
10
>>> a.dtype
dtype('int32')
>>> a.itemsize
4
4.5 ndarray 数组的元素类型
数据类型 | 说明 |
---|---|
bool | 布尔类型,True 或 False |
intc | 与C语言中的 int 类型一致,一般是int32或int64 |
intp | 用于索引的整数,与C语言中ssize_t一致,int32或int64 |
int8 | 字节长度的整型,取值:[-128,127] |
int16 | 16位长度的整型,取值:[-32768,32767] |
int32 | 32位长度的整型,取值:[-231,231-1] |
int64 | 64位长度的整型,取值:[-263,263-1] |
uint8 | 8位无符号整数,取值:[0,255] |
uint16 | 16位无符号整数,取值:[0,65535] |
uint32 | 32位无符号整数,取值:[0,232-1] |
uint64 | 64位无符号整数,取值:[0,264-1] |
float16 | 16位半精度浮点数:1位符号位,5位指数,10位尾数 |
float32 | 32位半精度浮点数:1位符号位,8位指数,23位尾数 |
float64 | 64位半精度浮点数:1位符号位,11位指数,52位尾数 |
complex64 | 复数类型,实部和虚部都是32位浮点数 |
complex128 | 复数类型,实部和虚部都是64位浮点数 |
- Q:ndarray 为什么要支持这么多类型?
科学计算涉及数据较多,对存储和性能都有较高要求
对元素类型精细定义,有助于NumPy合理使用存储空间并优化性能
对元素类型精细定义,有助于程序员对程序规模有合理评估
4.6 非同质的 ndarray 对象
- ndarry 数组可以由非同质对象构成
- 非同质 ndarry 元素为对象类型object
- 非同质 ndarry 对象无法有效发挥 NumPy 优势,尽量避免使用
4.7 ndarray 数组的创建方法
基本创建方法:
- 从python中的列表、元组等类型创建ndarray数组
- 使用NumPy中函数创建ndarray数组,如:arange,ones,zeros等
- 从字节流(raw bytes)中创建ndarray数组
- 从文件中读取特定格式,创建ndarray数组
(1)从python中的列表、元组等类型创建ndarray数组
>>> import numpy as np
>>> x = np.array([0, 1, 2, 3]) # 从列表类型创建
>>> print(x)
[0 1 2 3]
>>> x = np.array((4, 5, 6, 7)) # 从元组类型创建
>>> print(x)
[4 5 6 7]
>>> x = np.array([[1, 2], [9, 8], (0.1, 0.2)]) # 从列表和元组混和类型创建
>>> print(x)
[[1. 2. ]
[9. 8. ]
[0.1 0.2]]
(2)使用 NumPy 中函数创建 ndarray 数组
函数 | 说明 |
---|---|
np.arange(n) | 类似 range() 函数,返回 ndarray 类型,元素为从0到n-1的整型 |
np.ones(shape) | 根据 shape 生成一个元素类型为浮点型的全1数组,shape 是元组类型 |
np.zeros(shape) | 根据 shape 生成一个元素类型为浮点型的全0数组,shape 是元组类型 |
np.full(shape,val) | 根据 shape 生成一个数组,每个元素值都是val |
np.eye(n) | 创建一个n*n元素类型为浮点型单位方阵,对角线为1,其余为0 |
*可使用 dtype 指定数组对象元素类型
-
np.arange(n)
>>> np.arange(10) array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
-
np.ones(shape)
>>> np.ones((3, 6)) array([[1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1.]])
-
np.zeros(shape)
>>> np.zeros((3, 6)) array([[0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0.]]) >>> np.zeros((3, 6), dtype=np.int32) array([[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]])
-
np.full(shape,val)
>>> np.full((2, 3), 2) array([[2, 2, 2], [2, 2, 2]])
-
np.eye(shape)
>>> np.eye(5) array([[1., 0., 0., 0., 0.], [0., 1., 0., 0., 0.], [0., 0., 1., 0., 0.], [0., 0., 0., 1., 0.], [0., 0., 0., 0., 1.]]) >>> x = np.ones((2, 3, 4)) >>> print(x) [[[1. 1. 1. 1.] [1. 1. 1. 1.] [1. 1. 1. 1.]] [[1. 1. 1. 1.] [1. 1. 1. 1.] [1. 1. 1. 1.]]] >>> x.shape (2, 3, 4)
函数 | 说明 |
---|---|
np.ones_like(a) | 根据数组a的形状生成一个全1数组 |
np.zeros_like(a) | 根据数组a的形状生成一个全0数组 |
np.full_like(a,val) | 根据数组a的形状生成一个数组,每个元素值都是val |
👆这三个函数在进行大规模科学计算时特别重要。
(3)使用 NumPy 中其他函数创建 ndarray 数组
函数 | 说明 |
---|---|
np.linspace() | 根据起止数据等间距地填充数据,形成数组 |
np.concatenate() | 将两个或多个数组合并成一个新的数组 |
>>> a = np.linspace(1, 10, 4, dtype=int)
>>> a
array([ 1, 4, 7, 10])
>>> b = np.linspace(1, 10, 4, endpoint=False) # endpoint指定终止数值是否作为新数组的末尾值
>>> b
array([1. , 3.25, 5.5 , 7.75])
>>> c = np.concatenate((a, b))
>>> c
array([ 1. , 4. , 7. , 10. , 1. , 3.25, 5.5 , 7.75])
4.8 ndarray 数组的变换
方法 | 说明 |
---|---|
.reshape(shape) | 不改变数组元素,返回一个shape形状的数组,原数组不变 |
.resize(shape) | 与 np.reshape() 功能一致,但就地修改原数组,无返回值 |
.swapaxes(ax1, ax2) | 将数组n个维度中两个维度进行调换 |
.flatten() | 对数组进行降维,返回折叠后的一维数组,原数组不变 |
.astype(new_type) | 创建新的数组(原始数据的一个拷贝) |
.tolist() | 将 numpy 数组转换为列表类型并返回,不修改原数组 |
-
reshape(shape)
>>> x