numpy的使用

NumPy 是一个用于科学计算的 Python 库,全称为 Numerical Python,它提供了支持多维数组和矩阵运算的强大工具,还包含了许多用于数组操作的高效函数。它是 Python 数据分析和科学计算的基础库之一,常与其他库(如 SciPy、Pandas、Matplotlib)搭配使用。

引入numpy库:

1
import numpy as np

Ndarray 对象

NumPy 最重要的一个特点是其 N 维数组对象ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。
ndarray 对象是用于存放同类型元素的多维数组。
ndarray 中的每个元素在内存中都有相同存储大小的区域。

NumPy 数组的维数称为秩(rank),秩就是轴的数量,即数组的维度,一维数组的秩为 1,二维数组的秩为 2,以此类推。

在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。所以一维数组就是 NumPy 中的轴(axis),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。而轴的数量——秩,就是数组的维数。

很多时候可以声明 axis。axis=0,表示沿着第 0 轴进行操作,即对每一列进行操作;axis=1,表示沿着第1轴进行操作,即对每一行进行操作。

具体,Ndarray数组有以下属性:

属性 说明
ndarray.ndim 秩,即轴的数量或维度的数量
ndarray.shape 数组的维度,对于矩阵,n 行 m 列
ndarray.size 数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtype ndarray 对象的元素类型
ndarray.itemsize ndarray 对象中每个元素的大小,以字节为单位
ndarray.flags ndarray 对象的内存信息
ndarray.real ndarray元素的实部
ndarray.imag ndarray 元素的虚部
ndarray.data 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。

ndarray的创建

通过 array 从已有数组中创建

1
2
3
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
# object 数组或嵌套的数列
# ndmin 指定生成数组的最小维度
1
2
3
4
5
6
7
8
9
10
11
12
## 一维数组
np.array([1,2,3])
# array([1, 2, 3])

## 二维数组
np.array([[1, 2], [3, 4]])
# array([[1, 2],
# [3, 4]])

## 使用ndmin指定最小维度
np.array([1, 2, 3, 4, 5], ndmin = 2)
# array([[1, 2, 3, 4, 5]])

通过arange从数值范围创建数组

1
2
numpy.arange(start, stop, step, dtype)
# 包含start,不包含stop
1
2
3
4
5
6
7
8
9
10
11
np.arange(5)  
# array([0, 1, 2, 3, 4])

np.arange(5, dtype = float)
# array([0., 1., 2., 3., 4.])

np.arange(10, 20, 2)
# array([10, 12, 14, 16, 18])

np.arange(1,2,0.1)
# array([1. , 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9])

通过numpy.linspace 创建一个由等差数列构成的一维数组

1
2
3
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
# 包含start,也包含stop
# endpoint 该值为 true 时,数列中包含stop值,反之不包含,默认是True
1
2
3
4
5
np.linspace(1,10,10)
# array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])

# np.linspace(1,1,10)
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])

通过numpy.logspace 创建一个由等比数列构成的一维数组

1
2
3
4
5
6
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
# start:序列的起始值为base ** start
# stop: 序列的终止值为:base ** stop。如果endpoint为true,该值包含于数列中
# num: 要生成的等步长的样本数量,默认为50
# endpoint: 该值为 true 时,数列中中包含stop值,反之不包含,默认是True。
# base: 对数 log 的底数。
1
2
3
4
5
6
7
np.logspace(1.0, 2.0, num=10)  
# array([ 10. , 12.91549665, 16.68100537, 21.5443469 ,
# 27.82559402, 35.93813664, 46.41588834, 59.94842503,
# 77.42636827, 100. ])

np.logspace(0, 9, 10, base=2)
# array([ 1., 2., 4., 8., 16., 32., 64., 128., 256., 512.])

生成特殊形式数组
生成全0数组(zeros()函数),生成全1数组(ones()函数), 仅分配内存但不初始化的数组(empty()函数)

1
2
3
4
5
numpy.empty(shape, dtype = float, order = 'C')
numpy.zeros(shape, dtype = float, order = 'C')
numpy.ones(shape, dtype = None, order = 'C')
# shape 数组形状
# order 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。
1
2
3
4
5
np.empty([3,2], dtype=int)
# 3行2列,数组元素为随机值,因为它们未初始化。
# array([[4063294, 2097214],
# [ 0, 0],
# [ 0, 0]])

numpy.zeros_like创建一个与给定数组具有相同形状的数组,数组元素以 0 来填充。

1
2
numpy.zeros_like(a, dtype=None, order='K', subok=True, shape=None)
# a 给定要创建相同形状的数组

与此类似的,还有numpy.ones_like

切片和索引

ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。

ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stopstep 参数进行,从原数组中切割出一个新数组。

1
2
3
4
5
6
7
8
a = np.arange(10)    # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
s = slice(2, 7, 2) # 从索引 2 开始到索引 7 停止,间隔为2
a[s]
# array([2, 4, 6])

a = np.arange(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
b = a[2:7:2] # 从索引 2 开始到索引 7 停止,间隔为 2
# array([2, 4, 6])

条件索引:

1
2
3
4
5
6
7
8
9
import numpy as np

b = np.array([1, -2, 3, -4, 5])

print(b > 0)
# [ True False True False True]

print(b[b > 0])
# [1 3 5]

具体来说,b > 0 是一个布尔型的数组,其中的元素是根据条件 b > 0 是否满足来决定的,对于满足条件的元素,其对应的位置上的值为 True,否则为 False

然后,b[b > 0] 则是使用这个布尔型数组作为索引,从数组 b 中选择所有满足条件的元素,组成一个新的数组。

数组操作

修改数组形状

1
2
3
4
reshape	# 不改变数据的条件下修改形状
flat # 数组元素迭代器
flatten # 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
ravel # 返回展开数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
ndarray.reshape(newshape, order='C'))
numpy.reshape(arr, newshape, order='C')
# arr:要修改形状的数组
# newshape:整数或者整数数组,新的形状应当兼容原有形状
# 一个形状尺寸可以为-1。 在这种情况下,该值是根据数组的长度和其余维来推断的。
# order:'C' -- 按行,'F' -- 按列,'A' -- 原顺序,'k' -- 元素在内存中的出现顺序。

a = np.arange(9) # array([0, 1, 2, 3, 4, 5, 6, 7]) # 1维
a.reshape(3,3) # 3行3列,2维
# array([[0, 1, 2],
# [3, 4, 5],
# [6, 7, 8]])

a.reshape(3,3,1) # 3维
# array([[[0],
# [1],
# [2]],
#
# [[3],
# [4],
# [5]],
#
# [[6],
# [7],
# [8]]])

a.reshape(1,-1) # 2维,-1自行推断,这里为9,等价于a.reshape(1,9)
array([[0, 1, 2, 3, 4, 5, 6, 7, 8]])

翻转数组

1
2
3
4
transpose	# 对换数组的维度,转置
ndarray.T # 和 self.transpose() 相同
rollaxis # 向后滚动指定的轴
swapaxes # 对换数组的两个轴
1
2
3
4
5
6
7
8
9
10
a = np.arange(12).reshape(3,4)
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11]])

a.T
# array([[ 0, 4, 8],
# [ 1, 5, 9],
# [ 2, 6, 10],
# [ 3, 7, 11]])

数组元素的添加与删除

1
2
3
4
5
resize	# 返回指定形状的新数组
append # 将值添加到数组末尾
insert # 沿指定轴将值插入到指定下标之前
delete # 删掉某个轴的子数组,并返回删除后的新数组
unique # 查找数组内的唯一元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
numpy.resize(arr, shape)
# arr:要修改大小的数组
# shape:返回数组的新形状

a = np.array([[1,2,3],[4,5,6]])
b = np.resize(a, (3,2))
# array([[1, 2],
# [3, 4],
# [5, 6]])

np.resize(a, (3,3))
# array([[1, 2, 3],
# [4, 5, 6],
# [1, 2, 3]])

# 去重
numpy.unique(arr, return_index, return_inverse, return_counts)
# arr:输入数组,如果不是一维数组则会展开
# return_index:如果为true,返回新列表元素在旧列表中的位置(下标),并以列表形式储
# return_inverse:如果为true,返回旧列表元素在新列表中的位置(下标),并以列表形式储
# return_counts:如果为true,返回去重数组中的元素在原数组中的出现次数

a = np.array([5,2,6,2,7,5,6,8,2,9])
u = np.unique(a)
# array([2, 5, 6, 7, 8, 9])

a = np.array([[1,2,3],[5,2,3]])
np.unique(a)
# array([1, 2, 3, 5])

NumPy 数学函数

三角函数
NumPy 提供了标准的三角函数:sin()cos()tan()

舍入函数
numpy.around() 函数返回指定数字的四舍五入值。
numpy.floor() 返回小于或者等于指定表达式的最大整数,即向下取整。
numpy.ceil() 返回大于或者等于指定表达式的最小整数,即向上取整。

算术函数

加减乘除: add()subtract()multiply()divide()

numpy.reciprocal() 函数返回参数逐元素的倒数。如 1/4 倒数为 4/1。
numpy.power() 函数将第一个输入数组中的元素作为底数,计算它与第二个输入数组中相应元素的幂。
numpy.mod() 计算输入数组中相应元素的相除后的余数。 函数 numpy.remainder() 也产生相同的结果。

NumPy 线性代数

dot 两个数组的点积,即元素对应相乘。
vdot 两个向量的点积
inner 两个数组的内积
matmul 两个数组的矩阵积
determinant 数组的行列式
solve 求解线性矩阵方程
inv 计算矩阵的乘法逆矩阵

文章作者: Dar1in9
文章链接: http://dar1in9s.github.io/2023/10/05/机器学习/numpy的使用/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Dar1in9's Blog