NumPy 的初阶知识【上】
1. 简介
NumPy(Numerical Python) 是 Python 语言的一个运行速度非常快的扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库 ,通常与 SciPy和 Matplotlib(绘图库)一起使用
-
SciPy(Scientific Python) 是一个开源的 Python 算法库和数学工具包。 SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算
-
Matplotlib 是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面。它为利用通用的图形用户界面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 向应用程序嵌入式绘图提供了应用程序接口(API)
Python 的 List 和 NumPy中的数组对比:
Python的列表是异构的,因此列表的元素可以包含任何对象类型。
NumPy数组是同质的(即数组中的数据项的类型必须一致),只能存放同一种类型的对象,便于我们直接确定存储数组所需空间大小。数组由两部分构成:
- 存储在连续的内存块中的实际数据
- 描述实际数据的元数据
NumPy 中的大部分数组方法和函数都不会直接修改实际数据,而只能修改元数据Python的列表通常需要借助循环遍历元素并逐个处理,而NumPy使用了优化过的C API,所以运算速度很快
2. 数据类型及基础操作
2.1 NumPy的数据类型
📢注意:
- 不能把复数类型转化成整型或浮点型,否则会报错
TypeError
, 但浮点数是可以转化成复数的
2.2 Ndarray 对象
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引
ndarray 中的每个元素在内存中都有相同存储大小的区域
参数描述
object 数组或嵌套的数列
dtype 数组元素的数据类型,可选。
- 类 dtype 的属性str中保存的是一个表示数据类型的字符串,第一个字符串描述字节顺序,如果需要,后面会跟着字符码和数字,用来表示存储每个数组所需的字节数
- 字节顺序规定了32位或64位字内部各个字节的存储顺序。对于大端顺序(big-endian),先存放权重最高的字节,用
>
指出;对于小端顺序(little-endian),先存放权重最低的字节,用<
指出
copy
对象是否需要复制,可选
order
创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
subok
默认返回一个与基类类型一致的数组
ndmin
指定生成数组的最小维度补充:除了上述属性外,ndarray类型还有很多属性:
size
属性保存元素数量itemsize
属性返回数组中各元素所占用的字节数T
属性的作用与transpose()
函数相同flat
属性可返回一个numpy.flatier
对象,这是获得flatier
对象的唯一方法。我们可使用flat
的迭代器来遍历数组,要注意的是:如果用flat
属性迭代赋值,则该值会覆盖这个数组内的所有元素的值
下列为常见的数据类型及其字符码:(注:np.sctypeDict.keys()
可以列出所有数据类型的字节码)
类型 | 字符码 |
---|---|
整型 | i |
无符号整型 | u |
单精度浮点型 | f |
双精度浮点型 | d |
布尔型 | b |
复数型 | D |
字符串 | S |
万国码(unicode) | U |
空类型(Void) | V |
2.2.1 举例
import numpy as np
# 一维,输出:[1 2 3]
a = np.array([1,2,3])
print (a)
# 二维,输出:[[1, 2], [3, 4]]
a = np.array([[1, 2], [3, 4]])
print (a)
# 最小维度为二维
a = np.array([1, 2, 3, 4, 5], ndmin = 2)
print (a)
2.2.2 NumPy 数组转换成Python列表
tolist()
函数
import numpy as np
b = np.array([ 1.+1.j, 3.+2.j])
b.tolist()
print(b, '\n')
print(type(b))
2.2.3 把数组元素转换成指定类型
astype()
函数
import numpy as np
b = np.array([ 1.+1.j, 3.+2.j])
b.astype(int) # 当 complex 类型转换成 int 类型时,虚部被丢弃,此时会有ComplexWarning
print(b, '\n')
print(type(b))
b.astype('complex') # 将数据类型的名字以字符串的形式传递给 astype() 函数
print(b, '\n')
print(type(b))
2.3 创建数组
ndarray 数组除了可以使用底层 ndarray 构造器来创建外,也可以通过以下几种方式来创建:
numpy.empty(shape, dtype = float, order = 'C')
numpy.zeros(shape, dtype = float, order = 'C')
numpy.ones(shape, dtype = None, order = 'C')
numpy.asarray(a, dtype = None, order = None)
numpy.arange(start, stop, step, dtype)
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
2.3.1 指定形状(shape)、数据类型(dtype)且未初始化
numpy.empty(shape, dtype = float, order = 'C')
# 数组元素为随机值,因为它们未初始化。
import numpy as np
x = np.empty([3,2], dtype = int)
print (x)
2.3.2 指定大小的数组,数组元素以 0 来填充
numpy.zeros(shape, dtype = float, order = 'C')
# 设置类型为整数
y = np.zeros((5), dtype = int)
print(y)
2.3.3 指定形状的数组,数组元素以 1 来填充
numpy.ones(shape, dtype = None, order = 'C')
# 默认为浮点数,输出为:[1. 1. 1. 1. 1.]
x = np.ones(5)
print(x)
2.3.4 直接传入元素
-
numpy.asarray(a, dtype = None, order = None)
- 参数a可以是任意形式的输入参数:列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组
x = [1,2,3]
a = np.asarray(x)
print (a)
2.3.5 传入数值范围并返回 ndarray 对象
numpy.arange(start, stop, step, dtype)
# dtype 返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。
# 生成 0 到 5 的数组:
x = np.arange(5)
print (x)
# 设置了起始值、终止值及步长:
x = np.arange(10, 20, 2)
print (x)
2.3.6 由等差数列构成的一维数组
-
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
- num 要生成的等步长的样本数量,默认为50
- endpoint 该值为 true 时,数列中包含stop值,反之不包含,默认是True
- retstep 如果为 True 时,生成的数组中会显示间距,反之不显示
# 返回浮点数,输出:[10. 12. 14. 16. 18.]
a = np.linspace(10, 20, 5, endpoint = False)
print(a)
2.3.7 由等比数列构成的一维数组
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
# 默认底数是 10
a = np.logspace(1.0, 2.0, num = 10)
print (a)
2.4 NumPy 数组的属性
NumPy 数组的维数称为秩(rank),秩就是轴(axis)的数量,即数组的维度(dimensions)。 一维数组的秩为1,二维数组的秩为2,以此类推
import numpy as np
a = np.arange(24)
print (a.ndim) # a 现只有一个维度
# 现在调整其大小
b = a.reshape(2,4,3) # b 现在拥有三个维度
print (b.ndim)
print (b.shape) # 输出:(2, 4, 3)
print (b)
""" 输出:[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
[[12 13 14]
[15 16 17]
[18 19 20]
[21 22 23]]] """
2.5 索引与切片
-
标量索引:ndarray 数组可以基于0-n的下标进行索引,切片对象可以通过内置的 slice 函数
-
整数数组索引
-
布尔数组索引
-
花式索引
2.5.1 标量索引
import numpy as np
# 一维数组
a = np.arange(10)
s = slice(2, 7, 2) # slice(start, stop, step)
b = a[2:7:2]
# 使用 slice 函数和直接对数组进行索引切片所的结果一致
print(b == a[s]) # 输出为:[ True True True]
# 多维数组
a = np.array([[1,2,3], [3,4,5], [4,5,6]])
print(a)
print('从数组索引 a[1:] 处开始切割')
print(a[1:])
""" 输出:
[[3 4 5]
[4 5 6]] """
2.5.2 整数数组索引
import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0,1,2], [0,1,0]] # 获取(0, 0)、(1, 1)、(2, 0)位置的元素
print(y) # 输出为:[1 4 5]
2.5.3 布尔数组索引
import numpy as np
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print ('原数组是:')
print (x)
print ('\n')
# 现在我们会打印出大于 5 的元素
print ('大于 5 的元素是:')
print (x[x > 5]) # 输出为:[ 6 7 8 9 10 11]