NumPy是Python中用于数值计算的核心库之一。它提供了高性能的多维数组对象(称为ndarray),以及许多用于操作这些数组的函数。以下是NumPy的一些常见用法:
# 导入NumPy库
import numpy as np
1.创建数组:使用numpy.array()函数可以从Python列表或元组创建NumPy数组;查看数组属性,如形状(shape)
# 创建一个包含单个元素的数组
t1 = np.array(12)
# 输出数组
t1
array(12)
# 查看数组形状
t1.shape
()
# 创建一个二维数组
t2= np.array([[1,2,3],[4,5,6]])
# 输出数组
t2
array([[1, 2, 3],
[4, 5, 6]])
# 查看数组形状
t2.shape
(2, 3)
# 创建一个三维数组
t3 = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
# 输出数组
t3
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
# 查看数组形状
t3.shape
(2, 2, 3)
2.数组操作:NumPy的重塑操作(reshape)
# 使用 arange 函数创建一个数组
t4 = np.arange(12)
# 输出数组
t4
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
# 将数组重新调整形状为3行4列
t4.reshape((3,4))
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
# 使用 arange 函数创建一个3维数组,并将其形状设为2x3x4
t5 = np.arange(24).reshape(2,3,4)
# 输出数组
t5
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
# 将数组重新调整形状为4行6列
t5.reshape(4,6)
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
# 输出 t5,检查是否原始数组保持不变
t5
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
# 将 t5 重新调整形状为4行6列并更新 t5
t5=t5.reshape(4,6)
# 输出数组 t5
t5
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
# 将数组t5重新塑形为一维数组,长度为24
t5.reshape(24,)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23])
# 将数组t5重新塑形为二维数组,形状为(24,1)
t5.reshape(24,1)
array([[ 0],
[ 1],
[ 2],
[ 3],
[ 4],
[ 5],
[ 6],
[ 7],
[ 8],
[ 9],
[10],
[11],
[12],
[13],
[14],
[15],
[16],
[17],
[18],
[19],
[20],
[21],
[22],
[23]])
# 将数组t5重新塑形为二维数组,形状为(1,24)
t5.reshape(1, 24)
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23]])
# 将数组t5重新塑形为一维数组,长度为t5的元素总数
t6 = t5.reshape((t5.shape[0]*t5.shape[1],))
# 输出t6
t6
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23])
# 使用flatten方法将数组t5重新塑形为一维数组
t5.flatten()
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23])
3.数学运算:NumPy支持各种数学运算,如加法、减法、乘法、除法、矩阵运算等
# 输出原始数组t5
t5
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
# 将数组t5中的每个元素都加2
t5+2
array([[ 2, 3, 4, 5, 6, 7],
[ 8, 9, 10, 11, 12, 13],
[14, 15, 16, 17, 18, 19],
[20, 21, 22, 23, 24, 25]])
# 将数组t5中的每个元素都乘以2
t5*2
array([[ 0, 2, 4, 6, 8, 10],
[12, 14, 16, 18, 20, 22],
[24, 26, 28, 30, 32, 34],
[36, 38, 40, 42, 44, 46]])
# 将数组t5中的每个元素都除以2
t5/2
array([[ 0. , 0.5, 1. , 1.5, 2. , 2.5],
[ 3. , 3.5, 4. , 4.5, 5. , 5.5],
[ 6. , 6.5, 7. , 7.5, 8. , 8.5],
[ 9. , 9.5, 10. , 10.5, 11. , 11.5]])
# 尝试将数组t5中的每个元素都除以0,会出现警告,因为除以0是未定义的
t5/0
C:\Users\86132\AppData\Local\Temp\ipykernel_19092\1731533436.py:1: RuntimeWarning: divide by zero encountered in divide
t5/0
C:\Users\86132\AppData\Local\Temp\ipykernel_19092\1731533436.py:1: RuntimeWarning: invalid value encountered in divide
t5/0
array([[nan, inf, inf, inf, inf, inf],
[inf, inf, inf, inf, inf, inf],
[inf, inf, inf, inf, inf, inf],
[inf, inf, inf, inf, inf, inf]])
# 输出原始数组t5
t5
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
# 创建一个4x6的数组t6,其元素值从100开始递增,不包括124
t6=np.arange(100,124).reshape(4,6)
# 输出数组t6
t6
array([[100, 101, 102, 103, 104, 105],
[106, 107, 108, 109, 110, 111],
[112, 113, 114, 115, 116, 117],
[118, 119, 120, 121, 122, 123]])
# 将数组t6和t5相加
t6+t5
array([[100, 102, 104, 106, 108, 110],
[112, 114, 116, 118, 120, 122],
[124, 126, 128, 130, 132, 134],
[136, 138, 140, 142, 144, 146]])
# 将数组t6和t5相乘
t6*t5
array([[ 0, 101, 204, 309, 416, 525],
[ 636, 749, 864, 981, 1100, 1221],
[1344, 1469, 1596, 1725, 1856, 1989],
[2124, 2261, 2400, 2541, 2684, 2829]])
# 将数组t6和t5相除,由于t5中包含0,因此会出现警告
t6/t5
C:\Users\86132\AppData\Local\Temp\ipykernel_19092\2152116664.py:1: RuntimeWarning: divide by zero encountered in divide
t6/t5
array([[ inf, 101. , 51. , 34.33333333,
26. , 21. ],
[ 17.66666667, 15.28571429, 13.5 , 12.11111111,
11. , 10.09090909],
[ 9.33333333, 8.69230769, 8.14285714, 7.66666667,
7.25 , 6.88235294],
[ 6.55555556, 6.26315789, 6. , 5.76190476,
5.54545455, 5.34782609]])
# 创建一个长度为6的数组t7,其元素值从0开始递增
t7=np.arange(0,6)
# 输出数组t7
t7
array([0, 1, 2, 3, 4, 5])
t5
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
# 将数组t5和t7相减
t5-t7
array([[ 0, 0, 0, 0, 0, 0],
[ 6, 6, 6, 6, 6, 6],
[12, 12, 12, 12, 12, 12],
[18, 18, 18, 18, 18, 18]])
# 创建一个4x1的数组(列向量)
t8=np.arange(4).reshape(4,1)
# 输出t8
t8
array([[0],
[1],
[2],
[3]])
# 将t8从t5中减去
t5-t8
array([[ 0, 1, 2, 3, 4, 5],
[ 5, 6, 7, 8, 9, 10],
[10, 11, 12, 13, 14, 15],
[15, 16, 17, 18, 19, 20]])
# 创建一个10个元素的数组
t9=np.arange(10)
# 输出t9
t9
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
t5
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
# 尝试将t9从t5中减去,但由于形状不匹配,会引发错误
t5-t9
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[97], line 1
----> 1 t5-t9
ValueError: operands could not be broadcast together with shapes (4,6) (10,)
4.NumPy数组的转置
# 创建一个4x6的数组
t2 = np.arange(24).reshape(4,6)
# 输出t2
t2
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
# 转置t2
t2.transpose()
array([[ 0, 6, 12, 18],
[ 1, 7, 13, 19],
[ 2, 8, 14, 20],
[ 3, 9, 15, 21],
[ 4, 10, 16, 22],
[ 5, 11, 17, 23]])
# 转置t2的另一种方法
t2.T
array([[ 0, 6, 12, 18],
[ 1, 7, 13, 19],
[ 2, 8, 14, 20],
[ 3, 9, 15, 21],
[ 4, 10, 16, 22],
[ 5, 11, 17, 23]])
# 使用swapaxes方法交换t2的轴
t2.swapaxes(1,0)
array([[ 0, 6, 12, 18],
[ 1, 7, 13, 19],
[ 2, 8, 14, 20],
[ 3, 9, 15, 21],
[ 4, 10, 16, 22],
[ 5, 11, 17, 23]])
5.NumPy数组的条件索引操作
t2
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
# 创建一个布尔掩码,其中t2中小于10的元素为True,否则为False
t2<10
array([[ True, True, True, True, True, True],
[ True, True, True, True, False, False],
[False, False, False, False, False, False],
[False, False, False, False, False, False]])
# 将t2中小于10的元素设置为3
t2[t2<10]=3
# 输出t2
t2
array([[ 3, 3, 3, 3, 3, 3],
[ 3, 3, 3, 3, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
# 选择t2中大于20的元素
t2[t2>20]
array([21, 22, 23])
# 将t2中大于20的元素设置为20
t2[t2 > 20]=20
# 输出t2
t2
array([[ 3, 3, 3, 3, 3, 3],
[ 3, 3, 3, 3, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 20, 20, 20]])
# 创建一个新的数组,其中t2中小于等于3的元素为100,否则为300
np.where(t2<=3,100,300)
array([[100, 100, 100, 100, 100, 100],
[100, 100, 100, 100, 300, 300],
[300, 300, 300, 300, 300, 300],
[300, 300, 300, 300, 300, 300]])
# 尝试将NaN赋值给t2的第4行第4列,但由于t2是浮点数数组,所以会引发错误
t2[3,3]=np.nan
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[107], line 1
----> 1 t2[3,3]=np.nan
ValueError: cannot convert float NaN to integer
# 将t2转换为浮点数数组
t2=t2.astype(float)
# 将t2的第4行第4列设置为NaN
t2[3, 3] = np.nan
# 对数组 t2 中的元素进行剪切(clip)操作,将小于10的元素替换为10,将大于18的元素替换为18,而将处于10和18之间的元素保持不变
t2.clip(10,18)
array([[10., 10., 10., 10., 10., 10.],
[10., 10., 10., 10., 10., 11.],
[12., 13., 14., 15., 16., 17.],
[18., 18., 18., nan, 18., 18.]])
6.NumPy数组的堆叠操作
# 创建一个2x6的数组
t1 = np.arange(0,12).reshape(2, 6)
t1
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
# 创建一个2x6的数组
t2 = np.arange(12, 24).reshape(2, 6)
t2
array([[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
# 垂直堆叠t1和t2
np.vstack((t1, t2))
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
# 水平堆叠t1和t2
np.hstack((t1, t2))
array([[ 0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, 17],
[ 6, 7, 8, 9, 10, 11, 18, 19, 20, 21, 22, 23]])
7.NumPy数组行列的交换操作
# 创建一个3x4的数组
t = np.arange(12, 24).reshape(3, 4)
t
array([[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]])
# 交换t中的第2行和第3行
t[[1, 2], :] = t[[ 2,1], :]
t
array([[12, 13, 14, 15],
[20, 21, 22, 23],
[16, 17, 18, 19]])
# 交换t中第1列和第3列
t[:,[0,2]]=t[:,[2,0]]
t
array([[14, 13, 12, 15],
[22, 21, 20, 23],
[18, 17, 16, 19]])
8.NumPy创建特殊数组的快捷操作
# 创建一个2x3的全1数组
np.ones((2, 3))
array([[1., 1., 1.],
[1., 1., 1.]])
# 创建一个3x4的全0数组
np.zeros((3, 4))
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
# 创建一个10x10的单位矩阵
np.eye(10)
array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])
# 创建一个4x4的单位矩阵
t = np.eye(4)
t
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
9.NumPy的统计函数和NaN的特殊情况
# 在t的每一列中找到最大值的索引
np.argmax(t, axis=0)
array([0, 1, 2, 3], dtype=int64)
# 将t中所有值为1的元素替换为-1
t[t==1]=-1
t
array([[-1., 0., 0., 0.],
[ 0., -1., 0., 0.],
[ 0., 0., -1., 0.],
[ 0., 0., 0., -1.]])
# 在t的每一行中找到最小值的索引
np.argmin(t, axis=1)
array([0, 1, 2, 3], dtype=int64)
# 创建一个4x5的随机整数数组,范围在10到20之间
np.random.randint(10, 20, (4,5))
array([[11, 17, 15, 12, 10],
[13, 11, 13, 17, 10],
[14, 16, 11, 12, 17],
[19, 18, 11, 13, 16]])
# 比较两个NaN值是否相等
np.nan == np.nan
False
t2
array([[1, 2, 3],
[4, 5, 6]])
# t2的数值类型改为浮点数
t2 = t2.astype(float)
# 将t2的第2行第2列设置为NaN
t2[1, 1] = np.nan
t2
array([[ 0., 2., 3.],
[ 0., nan, 6.]])
# 将t2的第一列设置为0
t2[:,0]=0
t2
array([[ 0., 2., 3.],
[ 0., nan, 6.]])
# 计算t2中非零元素的数量
np.count_nonzero(t2)
4
# 创建一个布尔数组,其中t2中不等于自身的位置为True
t2!=t2
array([[False, False, False],
[False, True, False]])
# 计算t2中不等于自身的元素的数量
np.count_nonzero(t2 != t2)
1
# 创建一个布尔数组,其中t2中的NaN位置为True
np.isnan(t2)
array([[False, False, False],
[False, True, False]])
# 计算t2中NaN的数量
np.count_nonzero(np.isnan(t2))
1
# 计算t2中所有元素的和,由于t2中包含NaN,结果为NaN
np.sum(t2)
nan
# 创建一个3x4的整数数组
t3=np.arange(12).reshape(3,4)
t2
array([[ 0., 2., 3.],
[ 0., nan, 6.]])
t3
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
# 计算t3中所有元素的和
np.sum(t3)
66
# 计算t3中每一列的和
np.sum(t3, axis=0)
array([12, 15, 18, 21])
# 计算t3中每一行的和
np.sum(t3, axis=1)
array([ 6, 22, 38])
# 计算t2中每一列的和,由于t2中包含NaN,结果包含NaN
np.sum(t2, axis=0)
array([ 0., nan, 9.])
t2
array([[ 0., 2., 3.],
[ 0., nan, 6.]])
t2.sum(axis=0)
array([ 0., nan, 9.])
# 计算t2中每一列的平均值,由于t2中包含NaN,结果包含NaN
t2.mean(axis=0)
array([0. , nan, 4.5])
# 计算t2中每一列的中位数,由于t2中包含NaN,结果包含NaN
np.median(t2, axis=0)
array([0. , nan, 4.5])
# 计算t2的整体中位数,结果为NaN
np.median(t2)
nan
# 计算t2中每一列的最大值,由于t2中包含NaN,结果包含NaN
t2.max(axis=0)
array([ 0., nan, 6.])
# 计算t2中每一列的最小值,由于t2中包含NaN,结果包含NaN
t2.min(axis=0)
array([ 0., nan, 3.])
# 计算t2中每一列的极差(最大值与最小值之差),由于t2中包含NaN,结果包含NaN
np.ptp(t2, axis=0)
array([ 0., nan, 3.])
# 计算t2的整体极差,结果为NaN
np.ptp(t2)
nan