Python - Numpy库的使用(简单易懂)(2)

简介: Python - Numpy库的使用(简单易懂)(2)

数组的访问——数组的索引和切片

一维数组的索引和切片

import numpy as np
arr = np.arange(10)
print("原数组:",arr)
print("数组逆序:",arr[::-1])      #逆序
print("数组第3个元素:",arr[2])    #索引访问指定某个元素
print("数组最后一个元素:",arr[-1])
print("数组第3到6个元素:",arr[2:6])#切片访问多个元素
print("数组从第一位元素开始所有元素隔一个取一个:",arr[::2])
原数组: [0 1 2 3 4 5 6 7 8 9]
数组逆序: [9 8 7 6 5 4 3 2 1 0]
数组第3个元素: 2
数组最后一个元素: 9
数组第3到6个元素: [2 3 4 5]
数组从第一位元素开始所有元素隔一个取一个: [0 2 4 6 8]

多维数组的索引和切片

import numpy as np                  #导入模块并命名为 np
np.random.seed(100)                 #同一种子产生的一组随机数是相同的
arr=np.random.randint(0, 50, (4,5))    # 4行5列二维数组,20个随机整数都介于[0,50)
print("原数组:\n",arr)
print("数组第1行第2列元素:",arr[0,1])       #索引访问指定某个元素
print("数组第2,4行元素:\n",arr[[1,3],:])     #索引访问指定某些行元素
print("数组第1,2,3列元素:\n",arr[:,0:3])     #索引访问指定某些列元素
print("从第三行开始,第三列开始的元素:\n",arr[2:,2:])    #索引访问指定某些元素
print("数组最后两行,最后三列元素:\n",arr[-2:,-3:])
原数组:
 [[ 8 24  3 39 23]
 [15 48 10 30 34]
 [ 2 34 14 34 49]
 [48 24 15 36 43]]
数组第1行第2列元素: 24
数组第2,4行元素:
 [[15 48 10 30 34]
 [48 24 15 36 43]]
数组第1,2,3列元素:
 [[ 8 24  3]
 [15 48 10]
 [ 2 34 14]
 [48 24 15]]
数组最后两行,最后三列元素:
 [[14 34 49]
 [15 36 43]]
数组最后两行,最后三列元素:
 [[14 34 49]
 [15 36 43]]

数组的访问——修改数组元素的值

函数 。append() .insert() .delete()

可以使用索引和切片的方式直接修改数组中一个或者多个元素的值,也可以使用append、insert函数在原数组的基础上追加或者插入元素并返回新数组,还可以使用delete函数在原数组的基础上删除数组元素并返回新数组。

import numpy as np
arr = np.arange(10)
print("原数组:",arr)
arr1=np.append(arr,88)    #在数组最后追加一个元素88,生成新数组,原数组不变
print("数组追加元素:",arr1)
arr2=np.insert(arr,1,100) #索引为1的位置增加一个元素100,生成新数组,原数组不变
print("数组插入元素:",arr2)
arr3=np.delete(arr,3)     #删除索引为3的数组元素,生成新数组,原数组不变
print("删除索引为3的数组元素:",arr3)
arr[2]=66                 #将数组索引为2的元素修改为66,原数组发生变化
print("修改后数组:",arr)
原数组: [0 1 2 3 4 5 6 7 8 9]
数组追加元素: [ 0  1  2  3  4  5  6  7  8  9 88]
数组插入元素: [  0 100   1   2   3   4   5   6   7   8   9]
删除索引为3的数组元素: [0 1 2 4 5 6 7 8 9]
修改后数组: [ 0  1 66  3  4  5  6  7  8  9]

数组的运算——数组与数组的运算

数组算术运算

在numpy中数组支持与标量的加、减、乘、除、幂等算数运算,不需要通过循环就可以完成批量计算,计算结果为一个新数组,新数组的元素为标量与原数组中每个元素进行计算的结果。

import numpy as np
arr = np.arange(1,6)
print("原数组:",arr)
print("数组与数值相加:",arr+2)
print("数组与数值相减:",arr-2)
print("数组与数值相乘:",arr*2)
print("数组与数值相除:",arr/2)
print("数组与数值幂运算:",arr**2)
print("数组与数值取余:",arr%2)
原数组: [1 2 3 4 5]
数组与数值相加: [3 4 5 6 7]
数组与数值相减: [-1  0  1  2  3]
数组与数值相乘: [ 2  4  6  8 10]
数组与数值相除: [0.5 1.  1.5 2.  2.5]
数组与数值幂运算: [ 1  4  9 16 25]
数组与数值取余: [1 0 1 0 1]

二维数组与一维数组的运算

若两个相同维度的数组进行运算,生成一个新数组,新数组每个元素的值为原来的两个数组中对应位置上的元素进行运算的结果。若两个数组维度不同时,若符合广播要求则进行广播,否则就报错并结束运行。

import numpy as np
A = np.arange(1,13).reshape(4,3)    #4行3列数组
B = np.array([3])                             #1行1列数组 
C= A+B
print("{}+{}=\n{}".format(A,B,C))
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]+[3]=
[[ 4  5  6]
 [ 7  8  9]
 [10 11 12]
 [13 14 15]]
import numpy as np
A = np.arange(1,13).reshape(4,3)  #4行3列数组
B = np.array([2,1,3])             #1行3列数组  
C= A-B
print("{}-{}=\n{}".format(A,B,C))
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]-[2 1 3]=
[[-1  1  0]
 [ 2  4  3]
 [ 5  7  6]
 [ 8 10  9]]

二维数组与二维数组的运算

import numpy as np
A = np.arange(1,13).reshape(4,3)       #4行3列数组
B = np.array([[4],[5],[-2],[2]])       #4行1列数组
C= A*B
print("{}×\n{}=\n{}".format(A,B,C))
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]×
[[ 4]
 [ 5]
 [-2]
 [ 2]]=
[[  4   8  12]
 [ 20  25  30]
 [-14 -16 -18]
 [ 20  22  24]]

数组的运算——条件逻辑运算

数组的布尔运算:在numpy中可以使用基本的关系运算实现数组的条件运算,返回包含若干True/False的数组

True/False的数组

import numpy as np
np.random.seed(100)
arr = np.random.randint(1,21,10)
print("原数组:",arr)
print("判断数组中的元素是否大于 10:",arr>10)
print("数组中大于10的元素:",arr[arr>10])
print("统计数组中5~15的元素总数:",sum((arr>5)&(arr<15)))
print("是否都大于3:",np.all(arr>3))
print("是否有元素小于5:",np.any(arr<5))
原数组: [ 9  4  8 16 17 11  3  3  3 15]
判断数组中的元素是否大于 10: [False False False  True  True  True False False False  True]
数组中大于10的元素: [16 17 11 15]
统计数组中5~15的元素总数: 3
是否都大于3: False
是否有元素小于5: True

where用法

import numpy as np
arr = np.array([8,5,4,6,1,3,9,7])
print("原数组:",arr)
print("数组中大于5的元素对应1,其他对应0:",np.where(arr > 5 ,1,0))
print("数组中大于5的元素的索引:",np.where(arr>5))
print("数组中大于5的元素:",arr[np.where(arr>5)])
原数组: [8 5 4 6 1 3 9 7]
数组中大于5的元素对应1,其他对应0: [1 0 0 1 0 0 1 1]
数组中大于5的元素的索引: (array([0, 3, 6, 7], dtype=int64),)
数组中大于5的元素: [8 6 9 7]

布尔型索引

将同样大小的布尔数组传进索引,会返回一个由所有True对应位置的元素的数组

import numpy as np                  #导入模块并命名为 np
np.random.seed(100)                 #同一种子产生的一组随机数是相同的
arr=np.random.randint(0, 50, 10)    # 生成10个随机整数都介于[0,50)的一维数组
print("原数组:",arr)
print("数组大于20:",arr>20)
print("数组中大于20的元素:",arr[arr>20])
print("数组中大于20的奇数元素:",arr[(arr>20) & (arr%2!=0)])
原数组: [ 8 24  3 39 23 15 48 10 30 34]
数组大于20: [False  True False  True  True False  True False  True  True]
数组中大于20的元素: [24 39 23 48 30 34]
数组中大于20的奇数元素: [39 23]

数组的运算——numpy库常用的数学函数运算

函数 ceil() floor() round() exp().....

1688988032224.png

import numpy as np
import numpy as np
#通过乘 pi/180 转化为弧度
arr = np.array([0, 30, 45, 60, 90])* np.pi / 180
print('数组中不同角度的正弦值:\n',np.sin(arr))
print('数组中不同角度的余弦值:\n',np.cos(arr))
print('数组中不同角度的正切值:\n',np.tan(arr))
arr2=np.array([0,12,8,6.6,0.5,-2,-0.1,-0.6,-1.1])
print('e^array[i]的数组:\n',np.exp(arr2))
print('四舍五入(实则五舍六入):\n',np.round(arr2))
print('计算各元素的平方,等于array**2:\n',np.square(arr2))
print('计算各元素正负号:\n',np.sign(arr2))
print('向下取整,也就是取比这个数小的整数:\n',np.floor(arr2))
数组中不同角度的正弦值:
 [0.         0.5        0.70710678 0.8660254  1.        ]
数组中不同角度的余弦值:
 [1.00000000e+00 8.66025404e-01 7.07106781e-01 5.00000000e-01
 6.12323400e-17]
数组中不同角度的正切值:
 [0.00000000e+00 5.77350269e-01 1.00000000e+00 1.73205081e+00
 1.63312394e+16]
e^array[i]的数组:
 [1.00000000e+00 1.62754791e+05 2.98095799e+03 7.35095189e+02
 1.64872127e+00 1.35335283e-01 9.04837418e-01 5.48811636e-01
 3.32871084e-01]
四舍五入(实则五舍六入):
 [ 0. 12.  8.  7.  0. -2. -0. -1. -1.]
计算各元素的平方,等于array**2:
 [0.000e+00 1.440e+02 6.400e+01 4.356e+01 2.500e-01 4.000e+00 1.000e-02
 3.600e-01 1.210e+00]
计算各元素正负号:
 [ 0.  1.  1.  1.  1. -1. -1. -1. -1.]
向下取整,也就是取比这个数小的整数:
 [ 0. 12.  8.  6.  0. -2. -1. -1. -2.]

numpy中的数据统计与分析

排序 sort() argsort()

sort函数语法格式:np.sort(a, axis, kind, order)


参数说明:a:要排序的数组;axis:排序沿着指定轴对数组进行排序,0表示按行排序,1表示按列排序;


sort方法语法格式:a.sort()


功能:对数组a排序,改变原始数组,无返回值。

mport numpy as np
np.random.seed(100)
a=np.random.randint(10,100,12)
print("原数组a:",a)
print("使用sort函数排序结果:",np.sort(a)) #对数组排序,不改变原数组
print("原数组a不变:",a)
b=a.reshape(4,3)                #将a变形为4行3列数组b
print("二维数组b:\n",b)
print("二维数组b按行排序:\n",np.sort(b,axis=1))#axis =0垂直,1是水平
print("二维数组b按列排序:\n",np.sort(b,axis=0))
a.sort()     #改变原数组 ,无返回值                  
print("使用sort方法对数组a排序后改变原数组:",a)
原数组a: [18 34 77 97 89 58 20 62 63 76 24 44]
使用sort函数排序结果: [18 20 24 34 44 58 62 63 76 77 89 97]
原数组a不变: [18 34 77 97 89 58 20 62 63 76 24 44]
二维数组b:
 [[18 34 77]
 [97 89 58]
 [20 62 63]
 [76 24 44]]
二维数组b按行排序:
 [[18 34 77]
 [58 89 97]
 [20 62 63]
 [24 44 76]]
二维数组b按列排序:
 [[18 24 44]
 [20 34 58]
 [76 62 63]
 [97 89 77]]
使用sort方法对数组a排序后改变原数组: [18 20 24 34 44 58 62 63 76 77 89 97]
Process finished with exit code 0

argsort函数语法格式:np.argsort(a, axis, kind, order)

功能:对数组a排序,返回一个由整数构成的索引数组

import numpy as np
a=np.array([4,2,6])
print("原数组a:",a)
print("排序后:",np.argsort(a)) #原数组中索引为1的元素最小,索引为0的元素次之,索引为2的元素最大
原数组a: [4 2 6]
排序后: [1 0 2]

数据去重与重复 去重unique()  重复tile() repeat()

通过unique函数可以找出数组中的唯一值并返回已经排序的结果。

import numpy as np
colors=np.array(['red','blue','yellow','white','blue'])
print("原数组:",colors)
print("去重后的数组:",np.unique(colors))
原数组: ['red' 'blue' 'yellow' 'white' 'blue']
去重后的数组: ['blue' 'red' 'white' 'yellow']

tile函数语法格式:np.tile(A, reps)

repeat函数语法格式:np.repeat(A, reps, axis=None)

import numpy as np
arr = np.arange(5)
print("原数组:",arr)
arr1 = np.tile(arr,3)
print("原数组重复3次:",arr1)
arr2=np.arange(9).reshape(3,3)    #3行3列二维数组
print("二维数组:\n",arr2)
arr3 = np.repeat(arr2,2,axis=0)   #按行重复
print("二维数组按行重复2次:\n",arr3)
#axis =0垂直,1是水平
原数组: [0 1 2 3 4]
原数组重复3次: [0 1 2 3 4 0 1 2 3 4 0 1 2 3 4]
二维数组:
 [[0 1 2]
 [3 4 5]
 [6 7 8]]
二维数组按行重复2次:
 [[0 1 2]
 [0 1 2]
 [3 4 5]
 [3 4 5]
 [6 7 8]
 [6 7 8]]

常用统计函数 最大值、最小值、平均值、中值

计算数组的和、最大值、最小值

1688988186326.png

import numpy as np
np.random.seed(10)
arr = np.random.randint(0,20,9).reshape(3,3)     #3行3列数组
print("原数组:\n",arr)
print("数组全部元素求和:",np.sum(arr))
print("数组按行求最大值:",np.max(arr,axis=1))
print("数组按行求最大值索引:",np.argmax(arr,axis=1))
print("数组按列求最小值:",np.min(arr,axis=0))
print("数组按列求最小值索引:",np.argmin(arr,axis=0))
原数组:
 [[ 9  4 15]
 [ 0 17 16]
 [17  8  9]]
数组全部元素求和: 95
数组按行求最大值: [15 17 17]
数组按行求最大值索引: [2 1 0]
数组按列求最小值: [0 4 9]
数组按列求最小值索引: [1 0 2]
Process finished with exit code 0

计算数组均值、中值

函数

功能

median(a, axis)

沿指定轴计算数组中元素的中值

mean(a, axis)

沿指定轴计算数组中元素的平均值

import numpy as np
arr = np.array([[1,2,3],[4,5,6]])
print("原数组:\n",arr)
print("数组全部元素的平均值",np.mean(arr))
print("数组按行求平均值:",np.mean(arr,axis=1))
print("数组按列求平均值:",np.mean(arr,axis=0))
print("数组全部元素的中值",np.median(arr))
print("数组按行求中值:",np.median(arr,axis=1))
print("数组按列求中值:",np.median(arr,axis=0))
C:\python\Python310\python.exe A:/PycharmProjects/pythonProject/NumpyStudy.py
原数组:
 [[1 2 3]
 [4 5 6]]
数组全部元素的平均值 3.5
数组按行求平均值: [2. 5.]
数组按列求平均值: [2.5 3.5 4.5]
数组全部元素的中值 3.5
数组按行求中值: [2. 5.]
数组按列求中值: [2.5 3.5 4.5]
Process finished with exit code 0

计算数组方差、标准差、协方差矩阵

函数

功能

std(a, axis,ddof=1)

计算数组的标准差

var(a, axis,ddof=1)

计算数组的方差,标准差是方差的平方根

cov(a) 

计算协方差矩阵

import numpy as np
np.random.seed(10)
arr = np.random.randint(0,50,20).reshape(2,10)       #2行10列数组
print("原数组:\n",arr)
print("数组全部元素的方差",np.var(arr)) 
print("数组全部元素的无偏方差",np.var(arr,ddof=1)) 
print("数组按行求无偏方差:",np.var(arr,axis=1,ddof=1)) 
print("数组按列求方差:",np.var(arr,axis=0)) 
print("数组协方差矩阵:\n",np.cov(arr)) # 默认行为变量计算方式
C:\python\Python310\python.exe A:/PycharmProjects/pythonProject/NumpyStudy.py
原数组:
 [[ 9 36 15  0 49 28 25 29 48 29]
 [49  8  9  0 42 40 36 16 36 47]]
数组全部元素的方差 259.24750000000006
数组全部元素的无偏方差 272.89210526315793
数组按行求无偏方差: [246.17777778 328.67777778]
数组按列求方差: [400.   196.     9.     0.    12.25  36.    30.25  42.25  36.    81.  ]
数组协方差矩阵:
 [[246.17777778 101.4       ]
 [101.4        328.67777778]]
Process finished with exit code 0

计算数组的百分位数

函数的语法格式:percentile(a, q, axis)

参数说明:

  1. a: 输入数组;
  2. q: 要计算的百分比的数字,该数字在 0 ~ 100 之间;
  3. axis: 沿着它计算百分位数的轴。
import numpy as np
np.random.seed(10)
arr = np.random.randint(0,50,10)     
print("原数组:",arr)
print("数组的平均值",np.mean(arr))
print("数组的中值",np.median(arr))
print("数组的百分位为50的值:",np.percentile(arr,50)) 
print("数组的百分位为0,25,50,75,100的值:",np.percentile(arr,[0,25,50,75,100]))
C:\python\Python310\python.exe A:/PycharmProjects/pythonProject/NumpyStudy.py
原数组: [ 9 36 15  0 49 28 25 29 48 29]
数组的平均值 26.8
数组的中值 28.5
数组的百分位为50的值: 28.5
数组的百分位为0,25,50,75,100的值: [ 0.   17.5  28.5  34.25 49.  ]
Process finished with exit code 0

求解线性方程组——数组与矩阵

数组ndarray和矩阵matrix

numpy库包含了两种基本类型:数组ndarray和矩阵matrix。 numpy数组中所有元素的类型必须是相同的,矩阵matrix必须是二维的,是特殊的数组。matrix 拥有array的所有特性, matrix的主要优势是:相对简单的乘法运算符号。

import numpy as np
A_mat = np.mat([[1, 2],[3, 4]], int)  #创建矩阵
A_array = np.array([[1, 2],[3, 4]])   #创建二维数组
print("A_mat矩阵:\n",A_mat)
print("A_mat矩阵的类型:",type(A_mat))
print("A_array二维数组:\n",A_array)
print("A_array二维数组的类型:",type(A_array))
C:\python\Python310\python.exe A:/PycharmProjects/pythonProject/NumpyStudy.py
A_mat矩阵:
 [[1 2]
 [3 4]]
A_mat矩阵的类型: <class 'numpy.matrix'>
A_array二维数组:
 [[1 2]
 [3 4]]
A_array二维数组的类型: <class 'numpy.ndarray'>
Process finished with exit code 0

矩阵和数组的点乘运算

矩阵和数组的点乘运算有点不同:当采用 * 符号进行运算时,矩阵可以实现点乘运算,而数组的运算结果是对应元素的乘积;在调用 dot 函数时矩阵和数组均可实现点乘运算。dot 函数为矩阵乘法,该函数功能:若为一维数组,求出内积;若为二维数组,则进行矩阵乘法。矩阵乘法的第一个矩阵的列数(column)和第二个矩阵的行数(row)必须相同。

import numpy as np
A_mat = np.mat([[1, 2],[3, 4]], int)  #2×2矩阵
B_mat = np.mat([[1],[2]], int)        #2×1矩阵
print("A_mat*B_mat=\n",A_mat*B_mat)
print("dot函数矩阵计算结果:\n",np.dot(A_mat,B_mat))
A_array = np.array([[1, 2],[3, 4]])   #2×2二维数组
B_array = np.array([[1],[2]])         #2×1二维数组
print("A_array*B_array=\n",A_array*B_array)
print("dot函数数组计算结果:\n",np.dot(A_array,B_array))
C:\python\Python310\python.exe A:/PycharmProjects/pythonProject/NumpyStudy.py
A_mat*B_mat=
 [[ 5]
 [11]]
dot函数矩阵计算结果:
 [[ 5]
 [11]]
A_array*B_array=
 [[1 2]
 [6 8]]
dot函数数组计算结果:
 [[ 5]
 [11]]
Process finished with exit code 0

求解线性方程组

方法一:

import numpy as np
A_mat = np.mat([[2,1, -5, 1], [1,-3, 0, -6], [0,2, -1,2],[1,4,-7,6]], int)
b_mat = np.mat([[8], [6], [-2],[2]], int)
x = np.linalg.solve(A_mat, b_mat)
print("线性方程组的解:\n",x)
线性方程组的解:
 [[ 4.        ]
 [-1.55555556]
 [-0.22222222]
 [ 0.44444444]]

方法二:

import numpy as np
A_array = np.array([[2,1, -5, 1], [1,-3, 0, -6], [0,2, -1,2],[1,4,-7,6]])
b_array = np.array([[8], [6], [-2],[2]])
x = np.linalg.solve(A_array, b_array)
print("线性方程组的解:\n",x)
线性方程组的解:
 [[ 4.        ]
 [-1.55555556]
 [-0.22222222]
 [ 0.44444444]]
相关文章
|
24天前
|
XML JSON 数据库
Python的标准库
Python的标准库
162 77
|
2月前
|
机器学习/深度学习 算法 数据挖掘
数据分析的 10 个最佳 Python 库
数据分析的 10 个最佳 Python 库
102 4
数据分析的 10 个最佳 Python 库
|
25天前
|
XML JSON 数据库
Python的标准库
Python的标准库
47 11
|
2月前
|
人工智能 API 开发工具
aisuite:吴恩达发布开源Python库,一个接口调用多个大模型
吴恩达发布的开源Python库aisuite,提供了一个统一的接口来调用多个大型语言模型(LLM)服务。支持包括OpenAI、Anthropic、Azure等在内的11个模型平台,简化了多模型管理和测试的工作,促进了人工智能技术的应用和发展。
132 1
aisuite:吴恩达发布开源Python库,一个接口调用多个大模型
|
25天前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
64 8
|
1月前
|
安全 API 文件存储
Yagmail邮件发送库:如何用Python实现自动化邮件营销?
本文详细介绍了如何使用Yagmail库实现自动化邮件营销。Yagmail是一个简洁强大的Python库,能简化邮件发送流程,支持文本、HTML邮件及附件发送,适用于数字营销场景。文章涵盖了Yagmail的基本使用、高级功能、案例分析及最佳实践,帮助读者轻松上手。
35 4
|
2月前
|
测试技术 Python
Python中的异步编程与`asyncio`库
Python中的异步编程与`asyncio`库
|
4月前
|
机器学习/深度学习 数据处理 Python
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
114 0
|
5月前
|
机器学习/深度学习 数据处理 计算机视觉
NumPy实践宝典:Python高手教你如何轻松玩转数据处理!
【8月更文挑战第22天】NumPy是Python科学计算的核心库,专长于大型数组与矩阵运算,并提供了丰富的数学函数。首先需安装NumPy (`pip install numpy`)。之后可通过创建数组、索引与切片、执行数学与逻辑运算、变换数组形状及类型、计算统计量和进行矩阵运算等操作来实践学习。NumPy的应用范围广泛,从基础的数据处理到图像处理都能胜任,是数据科学领域的必备工具。
68 0
|
2月前
|
存储 数据处理 Python
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第27天】在科学计算和数据分析领域,Python凭借简洁的语法和强大的库支持广受欢迎。NumPy和SciPy作为Python科学计算的两大基石,提供了高效的数据处理和分析工具。NumPy的核心功能是N维数组对象(ndarray),支持高效的大型数据集操作;SciPy则在此基础上提供了线性代数、信号处理、优化和统计分析等多种科学计算工具。结合使用NumPy和SciPy,可以显著提升数据处理和分析的效率,使Python成为科学计算和数据分析的首选语言。
77 3