介绍
NumPy是Python的一个数学计算函数库,底层是C实现,执行效率高。它的其核心对象是ndarray N维数组,可以支持大量的维度数组与矩阵运算。
一、numpy常见属性
1.1、对象类型
使用numpy定义x1、x2两个数组,打印它们的类型,可见为ndarray
import numpy as np
x1 = np.array([[1, 2, 3], [4, 5, 6]])
x2 = np.array([1.0, 2.0])
# 输出对象类型
print(type(x1), type(x2))
执行结果
<class 'numpy.ndarray'> <class 'numpy.ndarray'>
1.2、数组维度
通过ndim
属性可以获得数组的维度,x1为二维,x2为一维
# 输出数组维度
print(x1.ndim, x2.ndim)
执行结果
2 1
1.3、数组形状
通过shape
属性可以获得数组的形状,x1为2行3列,x2是包含两个元素的一维数组
# 输出数组形状
print(x1.shape, x2.shape)
执行结果
(2, 3) (2,)
1.4、数据类型
通过dtype
属性可以获得数据类型,x1为int32整型,x2为float64浮点数
# 输出数据类型
print(x1.dtype, x2.dtype)
执行结果
int32 float64
二、数组创建方式
2.1、array()函数
# 直接使用array()函数生成
print(np.array([1, 2, 3]))
执行结果
[1 2 3]
2.2、zeros()函数
# 使用zeros()函数,生成值全为0的数组
print(np.zeros((2, 2)))
执行结果
[[0. 0.]
[0. 0.]]
2.3、ones()函数
# 使用ones()函数,生成值全为1的数组
print(np.ones((2, 2)))
执行结果
[[1. 1.]
[1. 1.]]
2.4、full()函数
# 使用full()函数,生成自定义数组,第一个参数是维度,第二参数是值
print(np.full((3, 5), 2))
执行结果
[[2 2 2 2 2]
[2 2 2 2 2]
[2 2 2 2 2]]
2.5、arange()函数
# 使用arange()函数生成,下面表示生成值从0到10之间,步长为2
print(np.arange(0, 10, 2))
执行结果
[0 2 4 6 8]
2.6、linspace()函数
# 使用linspace()函数生成,下面表示从0到1之间,均匀切分成20个元素
print(np.linspace(0, 1, 10))
执行结果
[0. 0.11111111 0.22222222 0.33333333 0.44444444 0.55555556
0.66666667 0.77777778 0.88888889 1. ]
2.7、random()函数
# 使用random()函数,生成随机数,下面表示2行3列
print(np.random.random((2, 3)))
执行结果
[[0.90641874 0.01024495 0.59446078]
[0.17317758 0.88951275 0.10003954]]
2.8、randint()函数
# 使用randint()函数,生成随机整数,low表示最小值,high表示最大值,size表示2行3列
print(np.random.randint(low=0, high=10, size=(2, 3)))
执行结果
[[2 5 1]
[1 4 5]]
2.9、normal()函数
# 使用normal()函数,生成正态分布(高斯分布),loc表示均值为2,scale表示标准差为3,size表示2行3列
print(np.random.normal(loc=2, scale=3, size=(2, 3)))
执行结果
[[ 8.19664286 4.76742324 0.14446856]
[ 3.27381939 2.10445444 -3.01358868]]
2.10、eye()函数
# 使用eye()函数,生成对角线为1的单位矩阵,下面表示5*5
print(np.eye(5))
执行结果
[[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.]]
2.11、reshape()函数
# reshape()函数,下面表示生成值为0-11之间的3行4列的数组
print(np.arange(0, 12).reshape((3, 4)))
执行结果
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
三、数组索引
定义数组x
x = np.arange(0, 12).reshape((3, 4))
print(x)
3.1、正数索引取值
# 获取第1行
print(x[0])
# 获取第1列
print(x[:, 0])
# 获取第1行第2个元素
print(x[0][1])
print(x[0, 1])
执行结果
[0 1 2 3]
[0 4 8]
1
1
3.2、负数索引取值
# 获取最后1行
print(x[-1])
# 获取最后1列
print(x[:, -1])
执行结果
[ 8 9 10 11]
[ 3 7 11]
四、数组合并
定义x
、y
两个数组
x = np.arange(0, 6).reshape((2, 3))
y = np.arange(6, 12).reshape((2, 3))
print(x)
print(y)
4.1、concatenate()函数
# 使用concatenate()函数合并数组
print(np.concatenate([x, y]))
执行结果
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
4.2、vstack()函数
# vstack()函数垂直方向合并数组
print(np.vstack([x, y]))
执行结果
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
4.3、hstack()函数
# hstack()函数水平方向合并数组
print(np.hstack([x, y]))
执行结果
[[ 0 1 2 6 7 8]
[ 3 4 5 9 10 11]]
五、数组拆分
定义数组z
z = np.arange(0, 16).reshape((4, 4))
print(z)
5.1、split()函数
# split()函数拆分数组
z1, z2 = np.split(z, [1])
print(z1)
print(z2)
执行结果
[[0 1 2 3]]
[[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
5.2、vsplit()函数
# vsplit()函数垂直方向拆分数组
z3, z4 = np.vsplit(z, [2])
print(z3)
print(z4)
执行结果
[[0 1 2 3]
[4 5 6 7]]
[[ 8 9 10 11]
[12 13 14 15]]
5.3、hsplit()函数
# hsplit()函数垂直方向拆分数组
z5, z6 = np.hsplit(z, [2])
print(z5)
print(z6)
执行结果
[[ 0 1]
[ 4 5]
[ 8 9]
[12 13]]
[[ 2 3]
[ 6 7]
[10 11]
[14 15]]
六、数组排序
6.1、sort排序
sort
返回元素排序结果
x = np.array([1, 5, 4, 2, 3])
print(np.sort(x))
执行结果
[1 2 3 4 5]
6.2、argsort排序
argsort
返回索引的排序结果
x = np.array([1, 5, 4, 2, 3])
print(np.argsort(x))
执行结果
[0 3 4 2 1]
6.3、指定axis排序
axis=0
返回按列排序结果,axis=1
返回按行排序结果
np.random.seed(1)
x = np.random.randint(0, 8, (3, 3))
print(x)
print(np.sort(x, axis=0))
print(np.sort(x, axis=1))
执行结果
[[5 3 4]
[0 7 1]
[3 5 7]]
[[0 3 1]
[3 5 4]
[5 7 7]]
[[3 4 5]
[0 1 7]
[3 5 7]]
6.4、按维度排序
通过argsort
先对某个维度索引排序,再实现对某个维度元素的整体排序
new_order = np.argsort(x[:, 2])
print(np.argsort(x[:, 2]))
print(x[new_order])
执行结果,实现对第3个维度的排序
[1 0 2]
[[0 7 1]
[5 3 4]
[3 5 7]]