作为python一个重要的扩展库,NumPy从一开始就以处理数据为核心,将多种语言的优势集中在一体,通过学习NumPy,我们可以更好的使用python处理复杂的数据,为人工智能的学习打下坚实的基础。
一、ndarray的使用
1.ndarray的特性
多维性
ndarray 可以表示任意维度的数组:一维(向量)、二维(矩阵)、三维及以上(张量)。
import numpy as np
arr = np.array(5) #创建0维的ndarray数组
print(arr)
print('arr的维度:',arr.ndim) #数组的维度number of dimensions
运行结果如下:
5
arr的维度: 0
arr = np.array([1,2,3]) #创建1维的ndarray数组
print(arr)
print('arr的维度:',arr.ndim) #数组的维度number of dimensions
运行结果如下:
[1 2 3]
arr的维度: 1
arr = np.array([[1,2,3],[4,5,6]]) #创建2维的ndarray数组
print(arr)
print('arr的维度:',arr.ndim) #数组的维度number of dimensions
运行结果如下:
[[1 2 3]
[4 5 6]]
arr的维度: 2
同质性
ndarray中所有元素必须是相同的数据类型(dtype),如 int32、float64、bool 等。
这保证了内存布局的连续性和计算效率。
arr = np.array([1,'hello']) #不同的数据类型会被强制转换为相同的数据类型
print(arr)
运行结果如下:
['1' 'hello']
arr = np.array([1,2.5]) #不同的数据类型会被强制转换为相同的数据类型
print(arr)
运行结果如下:
[1. 2.5]
2.ndarray的属性
arr = np.array(1)
print(arr)
print('数组的形状:',arr.shape)
print('数组的维度:',arr.ndim)
print('数组的元素的个数:',arr.size)
print('元素的数据类型:',arr.dtype)
print('元素的转置:',arr.T)
print('单个元素的内存占用:',arr.itemsize)
print('总站占用的内存空间:',arr.nbytes)
print('是否连续存储:',arr.flags)
运行结果如下:
1
数组的形状: ()
数组的维度: 0
数组的元素的个数: 1
元素的数据类型: int64
元素的转置: 1
单个元素的内存占用: 8
总站占用的内存空间: 8
是否连续存储: C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
arr = np.array([1,2.5,3])
print(arr)
print('数组的形状:',arr.shape)
print('数组的维度:',arr.ndim)
print('数组的元素的个数:',arr.size)
print('元素的数据类型:',arr.dtype)
print('元素的转置:',arr.T)
print('单个元素的内存占用:',arr.itemsize)
print('总站占用的内存空间:',arr.nbytes)
print('是否连续存储:',arr.flags)
运行结果如下:
[1. 2.5 3. ]
数组的形状: (3,)
数组的维度: 1
数组的元素的个数: 3
元素的数据类型: float64
元素的转置: [1. 2.5 3. ]
单个元素的内存占用: 8
总站占用的内存空间: 24
是否连续存储: C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
arr = np.array([[1,2,3],[4,5,6]])
print(arr)
print('数组的形状:',arr.shape)
print('数组的维度:',arr.ndim)
print('数组的元素的个数:',arr.size)
print('元素的数据类型:',arr.dtype)
print('元素的转置:\n',arr.T)
print('单个元素的内存占用:',arr.itemsize)
print('总站占用的内存空间:',arr.nbytes)
print('是否连续存储:',arr.flags)
运行结果如下:
[[1 2 3]
[4 5 6]]
数组的形状: (2, 3)
数组的维度: 2
数组的元素的个数: 6
元素的数据类型: int64
元素的转置:
[[1 4]
[2 5]
[3 6]]
单个元素的内存占用: 8
总站占用的内存空间: 48
是否连续存储: C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
3.ndarray的创建
# 基础的创建方法
list1=[4,5,6]
arr = np.array(list1,dtype=np.float64)
print(arr.ndim) #属性
print(arr)
运行结果如下:
1
[4. 5. 6.]
#copy
arr1=np.copy(arr) # 元素跟原始的数组相同,但是不是一个数组
print(arr1)
arr1[0]=8
print(arr1)
print(arr)
运行结果如下:
[4. 5. 6.]
[8. 5. 6.]
[4. 5. 6.]
# 预定义的形状
#全0 全1 未初始化 固定值
arr= np.zeros((2,3),dtype=int)
print(arr)
print(arr.dtype)
运行结果如下:
[[0 0 0]
[0 0 0]]
int64
arr= np.zeros((200,),dtype=int)
print(arr)
运行结果如下:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
#全1
arr= np.ones((5,8),dtype=int)
print(arr)
运行结果如下:
[[1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1]]
# 未初始化
arr= np.empty((4,5))
print(arr)
运行结果如下:
[[4.47593816e-091 4.67350283e+257 9.27777147e+242 3.59363012e+246
5.98189051e-154]
[3.15474899e+180 1.27966031e-152 1.33856864e-152 1.32971161e-152
2.31276869e-152]
[9.29433783e+242 2.31634000e-152 2.44012173e-154 7.13119939e+252
1.27990068e-152]
[4.83245960e+276 6.12501442e+257 2.42766850e-154 5.37266662e+005
6.01346953e-154]]
arr= np.full((3,4),2025)
print(arr)
运行结果如下:
[[2025 2025 2025 2025]
[2025 2025 2025 2025]
[2025 2025 2025 2025]]
arr1= np.zeros_like(arr)
print(arr1)
arr1= np.empty_like(arr)
print(arr1)
arr1= np.ones_like(arr)
print(arr1)
arr1= np.full_like(arr,2026)
print(arr1)
运行结果如下:
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
[[ 2222002171112 64 0
0]
[ 27303467877924864 3617858582444585571 3689065128682206310
3474635106050072880]
[3703757910348751201 3617908038241236581 7147837364112536632
7005402423849738800]]
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
[[2026 2026 2026 2026]
[2026 2026 2026 2026]
[2026 2026 2026 2026]]
# 等差数列 2 4 6 8 10
arr =np.arange(1,51,1) # start end step(步长)
print(arr)
运行结果如下:
[ 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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50]
# 等间隔数列
arr=np.linspace(0,10,3)
print(arr)
运行结果如下:
[ 0. 5. 10.]
arr=np.linspace(0,100,5,dtype=int)
print(arr)
arr =np.arange(0,101,25)
print(arr)
运行结果如下:
[ 0 25 50 75 100]
[ 0 25 50 75 100]
# 对数间隔数列
arr=np.logspace(0,4,3,base=2)
print(arr)
[ 1. 4. 16.]
运行结果如下:
# 特殊矩阵
# 单位矩阵:主对角线上的数字为1,其他的数字为0
arr =np.eye(3,4,dtype=int)
print(arr)
运行结果如下:
[[1 0 0 0]
[0 1 0 0]
[0 0 1 0]]
# 对角矩阵:主对角线上非零的0,其他的数字为0
arr=np.diag([1,2,3]) #主对角线上的数字
print(arr)
运行结果如下:
[[1 0 0]
[0 2 0]
[0 0 3]]
# 随机数组的生成
# 生成0到1之间的随机浮点数(均匀分布)
arr= np.random.rand(2,3)
print (arr)
运行结果如下:
[[0.68452047 0.14467946 0.74719696]
[0.68790144 0.36233262 0.72555077]]
# 生成指定范围区间的随机浮点数
arr=np.random.uniform(3,6,(2,3))
print(arr)
运行结果如下:
[[4.98418627 4.52013717 4.38460385]
[5.48310141 5.11632599 4.468011 ]]
# 生成指定范围区间的随机整数
arr=np.random.randint(3,30,(2,3))
print(arr)
运行结果如下:
[[19 8 14]
[27 3 29]]
#生成随机数列(正态分布)
# 两边小,中间大
arr= np.random.randn(2,3)
print(arr)
运行结果如下:
[[-1.17280171 0.38570995 0.34056669]
[-0.90508369 0.15706861 -1.42321051]]
#设置随机种子
np.random.seed(20)
arr= np.random.randint(1,10,(2,5))
print(arr)
运行结果如下:
[[4 5 7 8 3]
[1 7 9 6 4]]
4.ndarray的数据类型
布尔类型 bool
整数类型 int uint
浮点数 float
复数 complex
arr = np.array([1,0,2,0],dtype=np.bool)
print(arr)
运行结果如下:
[ True False True False]
arr = np.array([1,0,127,0],dtype=np.int8)
print(arr)
运行结果如下:
[ 1 0 127 0]
5.索引与切片
# 一维数组的索引与切片
arr = np.random.randint(1,100,20)
print(arr)
运行结果如下:
[17 63 17 8 99 7 27 14 76 59 26 4 75 76 62 78 84 58 95 33]
print(arr[10])
print(arr[:]) # 获取全部的数据
print(arr[2:5]) # start:end+1 左包右不包
print(arr[ (arr>10) & (arr<70) ]) # 布尔索引
print(arr[slice(2,15,3)]) # start:end,step
运行结果如下:
26
[17 63 17 8 99 7 27 14 76 59 26 4 75 76 62 78 84 58 95 33]
[17 8 99]
[17 63 17 27 14 59 26 62 58 33]
[17 7 76 4 62]
# 二维数组的索引与切片
arr=np.random.randint(1,100,(4,8))
print(arr)
运行结果如下:
[[11 7 76 19 4 78 18 44]
[17 19 80 91 60 72 76 30]
[46 7 64 79 25 19 94 34]
[79 43 95 4 19 71 53 23]]
print(arr[1,3]) # 索引
print(arr[1,2:5])
print(arr[2][arr[2]>50])
print(arr[:,3])
运行结果如下:
91
[80 91 60]
[64 79 94]
[19 91 79 4]
6.ndarray的运算
#算术运算
a=np.array([1,2,3])
b = np.array([4,5,6])
print(a+b)
print(a-b)
print(a*b)
print(a/b)
print(a**2)
运行结果如下:
[5 7 9]
[-3 -3 -3]
[ 4 10 18]
[0.25 0.4 0.5 ]
[1 4 9]
c=[1,2,3]
d= [4,5,6]
print(c+d)
# print(c-d) 报错
for i in range(len(c)):
d[i]+=c[i]
print(d)
运行结果如下:
[1, 2, 3, 4, 5, 6]
[5, 7, 9]
#算术运算
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.array([[4,5,6],[7,8,9],[1,2,3]])
print(a+b)
print(a-b)
print(a*b)
print(a/b)
print(a**2)
运行结果如下:
[[ 5 7 9]
[11 13 15]
[ 8 10 12]]
[[-3 -3 -3]
[-3 -3 -3]
[ 6 6 6]]
[[ 4 10 18]
[28 40 54]
[ 7 16 27]]
[[0.25 0.4 0.5 ]
[0.57142857 0.625 0.66666667]
[7. 4. 3. ]]
[[ 1 4 9]
[16 25 36]
[49 64 81]]
#数组与数字间的算术运算
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(a+3)
print(a*3)
运行结果如下:
[[ 4 5 6]
[ 7 8 9]
[10 11 12]]
[[ 3 6 9]
[12 15 18]
[21 24 27]]
# 广播机制 :1.获取形状 2.是否可以广播
# 同一维度:相同 1
a= np.array([1,2,3])
b=np.array([[4],[5],[6]])
print(a+b)
print(b-a)
运行结果如下:
[[5 6 7]
[6 7 8]
[7 8 9]]
[[3 2 1]
[4 3 2]
[5 4 3]]
# a= np.array([1,2,3])
# b=np.array([4,5])
# print(a+b)
# 矩阵运算
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.array([[4,5,6],[7,8,9],[1,2,3]])
print(a@b)
运行结果如下:
[[ 21 27 33]
[ 57 72 87]
[ 93 117 141]]
二、 numpy中的常用函数
1. 基本数学函数
# 计算平方根
print(np.sqrt(9))
print(np.sqrt([1,4,9]))
arr=np.array([1,25,81])
print(np.sqrt(arr))
运行结果如下:
3.0
[1. 2. 3.]
[1. 5. 9.]
# 计算指数 e^x
print(np.exp(0))
运行结果如下:
1.0
# 计算自然对数 lnX
print(np.log(2.71))
运行结果如下:
0.9969486348916096
# 计算正弦值、余弦值
print(np.sin(np.pi/2))
print(np.cos(np.pi))
运行结果如下:
1.0
-1.0
# 计算绝对值
arr = np.array([-1,1,2,-3])
print(np.abs(arr))
运行结果如下:
[1 1 2 3]
# 计算a的b次幂
print(np.power(arr,2))
运行结果如下:
[1 1 4 9]
# 四舍五入
print(np.round([3.2,4.5,8.1,9.6]))
运行结果如下:
[ 3. 4. 8. 10.]
# 向上取整,向下取整
arr = np.array([1.6,25.1,81.7])
print(np.ceil(arr))
print(np.floor(arr))
运行结果如下:
[ 2. 26. 82.]
[ 1. 25. 81.]
# 检测缺失值NaN
np.isnan([1,2,np.nan,3])
运行结果如下:
array([False, False, True, False])
2. 统计函数
求和、计算平均值、计算中位数、标准差、方差
查找最大值、最小值
计算分位数、累积和、累积差
arr=np.random.randint(1,20,8)
print(arr)
运行结果如下:
[15 5 12 9 7 16 19 15]
# 求和
print(np.sum([1,2,3]))
运行结果如下:
6
# 计算平均值
print(np.mean(arr))
运行结果如下:
12.25
# 计算中位数
# 奇数:排序后中间的数值
# 偶数:中间的两个数的平均值
print(np.median([1,2,4]))
运行结果如下:
2.0
# 计算标准差和方差
# 1,2,3的平均值 2
# ((1-2)^2+(2-2)^2+(3-2)^2)/3=0.6666666666
print(np.var([1,2,3]))
print(np.std([1,2,3]))
运行结果如下:
0.6666666666666666
0.816496580927726
# 计算最大值、最小值
print(arr)
print(np.max(arr),np.argmax(arr))
print(np.min(arr),np.argmin(arr))
运行结果如下:
[15 5 12 9 7 16 19 15]
19 6
5 1
# 分位数
# 中位数
print(np.median([1,2,3]))
print(np.median([1,2,3,4]))
np.random.seed(0)
arr = np.random.randint(0,100,4)
print(arr)
print(np.median(arr))
print(np.percentile(arr,20))
运行结果如下:
2.0
2.5
[44 47 64 67]
55.5
45.8
# 累积和、累积积
arr = np.array([1,2,3])
print(np.sum(arr))
print(np.cumsum(arr))
print(np.cumprod(arr))
运行结果如下:
6
[1 3 6]
[1 2 6]
3.比较函数
比较是否大于、小于、等于
逻辑与、或、非
检查数组中是否有一个True,是否所有的都为True,自定义条件
# 是否大于
print(np.greater([3,4,5,6,7],4))
# 是否小于
print(np.less([3,4,5,6,7,8],4))
# 是否等于
print(np.equal([3,4,5,6,7,8],4))
print(np.equal([3,4,5],[4,4,4]))
运行结果如下:
[False False True True True]
[ True False False False False False]
[False True False False False False]
[False True False]
print(np.logical_and([0,0],[1,1]))
print(np.logical_or([0,0],[1,0]))
print(np.logical_not([1,0]))
运行结果如下:
[False False]
[ True False]
[False True]
# 检查元素是否至少有一个元素为True
print(np.any([0,0,0,0.0]))
# 检查是否全部元素为True
print(np.all([1,1]))
运行结果如下:
False
True
# 自定义条件
# print(np.where(条件,符合条件,不符合条件))
arr = np.array([1,2,3,4,5])
print(np.where(arr<3,arr,0))
运行结果如下:
[1 2 0 0 0]
# np.select(条件,返回结果)
score=np.array([80,70,40])
print(np.select([score>80,(score>=60)&(score<=80),score<60],['优秀','良好','不及格'],default='未知'))
运行结果如下:
['良好' '良好' '不及格']
# 排序函数
np.random.seed(0)
arr = np.random.randint(1,100,20)
print(arr)
print(arr.sort())
print(arr.argsort())
print(arr)
运行结果如下:
[45 48 65 68 68 10 84 22 37 88 71 89 89 13 59 66 40 88 47 89]
None
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
[10 13 22 37 40 45 47 48 59 65 66 68 68 71 84 88 88 89 89 89]
# 去重函数
print(np.unique(arr))
运行结果如下:
[10 13 22 37 40 45 47 48 59 65 66 68 71 84 88 89]
# 数组的拼接
arr1= np.array([1,2,3])
arr2 = np.array([4,5,6])
print(arr1+arr2)
print(np.concatenate((arr1,arr2)))
运行结果如下:
[5 7 9]
[1 2 3 4 5 6]
# 数组的分割
print(np.split(arr,5))
运行结果如下:
[array([10, 13, 22, 37], dtype=int32), array([40, 45, 47, 48], dtype=int32), array([59, 65, 66, 68], dtype=int32), array([68, 71, 84, 88], dtype=int32), array([88, 89, 89, 89], dtype=int32)]
# 调整数组的形状
print(np.reshape(arr,[5,4]))
运行结果如下:
[[10 13 22 37]
[40 45 47 48]
[59 65 66 68]
[68 71 84 88]
[88 89 89 89]]