目录
在上一篇中,了解了NumPy中的数组创建以及基础操作。那么本篇我们就来讲解一下数组的简单运算以及其中的数据统计。
Numpy数组
数组的基本运算
在python中,如果我们要两个数组相加/乘/减/除,那么我们需要利用循环来进行,但是在NumPy中,我们可以直接相乘等。
(注意哦,记得提前导包)
乘法
# 将两个数组相乘
a = np.array([1,2,3,4])
b = np.array([5,6,7,8])
c = a*b
c
array([ 5, 12, 21, 32])
加法
# 将两个数组相加
a = np.array([1,2,3,4])
b = np.array([5,6,7,8])
c = a+b
c
array([ 6, 8, 10, 12])
其他的类似。
# 给数组开平方
a = np.array([1,2,3,4])
a = a**2
a
array([ 1, 4, 9, 16])
数组的数据统计
这个相对比较简单,用多了就会。
平均值
numpy.mean(arr,axis=None,dtype=None,out=None)
- arr:所要计算平均值的数组;
- axis:沿着哪个方向进行计算平均值(0为竖直,1为水平,默认全部计算);
- dtype:返回结果的数据类型;
- out:将结果存储在指定数组中。
示例:
# 现有一个二维数组,计算每一行的平均值
a = np.array([
[1,2,3,4,5,6,7,8,9],
[3,5,7,4,11,12,4,6,7]
])
b = np.mean(a,axis=1)
b
array([5. , 6.55555556])
中位数
numpy.median(arr,axis=None,out=None)
参数的意思跟平均值中的参数含义相同。
示例:
# 求数组的中位数
a = [1,2,4,5,6,7]
b = np.median(a)
b
4.5
最大值和最小值
numpy.max(arr,axis=None,out=None)
numpy.min(arr,axis=None,out=None)
参数含义和平均值的参数一样。
# 求数组中的最小值和最大值
a = np.array([
[12,34,5,23,4,3],
[1,2,4,5,6,5]
])
b = np.max(a)
c = np.min(a)
b,c
(34, 1)
求和
numpy.sum(arr,axis=None,out=None)
# 求数组元素之和
a = np.array([
[12,34,5,23,4,3],
[1,2,4,5,6,5]
])
sum = np.sum(a)
sum
104
累积和
numpy.cumsum(arr,axis=None,dtype=None,out=None)
参数意思和mean()的参数一样。
# 求数组累积和
a = np.array([
[12,34,5,23,4,3],
[1,2,4,5,6,5]
])
sum = np.cumsum(a)
sum
array([ 12, 46, 51, 74, 78, 81, 82, 84, 88, 93, 99, 104])
标准差
numpy.std(arr,axis=None,dtype=None,out=None)
方差
numpy.var(arr,axis=None,out=None)
示例:
# 计算数组的方差,标准差
a = np.array([4,7,3,9,6,10])
b = np.std(a)
c = np.var(a)
b,c
(2.5, 6.25)
切片和索引
索引
索引,在NumPy中,简单来说就是下标,利用索引来访问和修改特定元素。
一维数组的索引
# 给定一个一维数组
a = np.array([1,2,3,4,5])
# 访问其中的第三个元素(下标从0开始)
print(a[2])
3
二维数组的索引
# 给定一个二维数组
a = np.array([
[1,2,3,4,5],
[6,7,8,9,10]
])
# 访问其中在第二行第3列个元素 [][]:第一个括号是行索引,第二个括号是列索引。
print(a[1][2])
8
获取多个元素
如果我们想一次获取数组中多个特定的元素,那么我们可以采用逗号隔开;
a[[1,3],[1,1]] :中第一个列表[1,3]表示的是行索引,第二个列表中的[1,1]表示的是列索引。
a = np.arange(20).reshape(4,5)
print(a)
# 现要取出其中的6和16,可以采用逗号分隔的形式
b = a[[1,3],[1,1]]
b
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
array([ 6, 16])
布尔索引
布尔索引其实就是利用bool值,来对数组中某些元素进行筛选。
示例:
a = np.array([1,2,3,4,5,6])
#获取其中大于3的数
b = a>3
b
array([False, False, False, True, True, True])
接着我们在借助这个布尔数组b,来筛选出a数字中大于3的元素:
a = np.array([1,2,3,4,5,6])
#获取其中大于3的数
b = a>3
print(b)
c = a[b]
c
[False False False True True True]
array([4, 5, 6])
切片
切片操作和python中列表切片操作一样。
语法:[start:stop:step]
- start:切片起始位置;
- stop:切片终止位置;
- step:步长,每次跳过元素的个数,默认1。
一维数组切片
a = np.array([1,2,3,4,5,6])
#现要切出4以后的数
b = a[3::]
b
array([4, 5, 6])
二维数组切片
对于二维数组切片,我们采用逗号隔开的方式来进行切片,例如:
a[1:3,1:4]表示的就是从第一个维度(行)索引1到2(不包含2),在从第二个维度(列)的索引1到4(不包含4)的子数组。
a = np.array([
[1,2,3,4,5],
[6,7,8,9,10],
[11,12,13,14,15],
[11,11,11,11,11]
])
# 现在要从a数组中提取出第二行到第三行的元素
b = a[1:3]
print(b)
# 再从这两行中,只提取中间3列的元素
b = a[1:3,1:4]
print(b)
[[ 6 7 8 9 10]
[11 12 13 14 15]]
[[ 7 8 9]
[12 13 14]]
多维数组切片
对于二维及二维以上的数组,我们都采用逗号隔开的方式来切片多个维度。
当然,我们也可以采用“...”的方式简化操作。
# 生成一个2*3*4的三维数组
a = np.arange(24).reshape(2,3,4)
print(a)
print(a[1,...]) #等价a[1,:,:]
print(a[...,1]) #等价a[:,:,1]
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]
[[ 1 5 9]
[13 17 21]]
广播机制
广播(Broadcast)是numpy对不同形状的数组进行数值运算的方式,对数组的算术运算通常在相应的元素上进行。
广播机制会对形状小的数组进行自动扩展,使得两个数组的形状相同再进行运算。
规则
- 让所有输入数组都向其中形状最长的数组看齐,形状中农不足部分都通过前面加1补齐;
- 输出数组的形状是输入数组形状的各个维度上的最大值;
- 如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度都为1时,这个数组能够用来计算,否则出错;
- 当输入数组的某个维度的长度为1时,沿着此维度运算时都用此维度上的第一组值。
示例:
a = np.array([
[1,2,3],
[4,5,6]
])
b = np.array([1,2,3])
print(a.shape)
print(b.shape)
c = a*b
print(c,c.shape)
(2, 3)
(3,)
[[ 1 4 9]
[ 4 10 18]] (2, 3)
可以看到,b数组会被扩展到和a一样的形状,再进行运算。
理解
-
将两个数组的维度大小右对齐,然后比较对应维度上的数值;
-
如果数值相等或其中一个为1或者为空,则能进行广播运行;
-
输出的维度大小为取数值大的数值,否则不能进行数组运算。
所以在广播时候,需要注意数组维度其中要么有一个是1,要么维度都相等。
以上就是本篇所有内容咯,若有不足,欢迎指正~