前面我门已经学习了 Numpy 的索引和切片,然而得到这些索引或切片对象不是最终目的,我们的目的是对这些数据对象进行数据运算,从而分析处理数据。
但是我们在数据分析时,需要处理很多的数据(嗯,很多很多…),这个时候我们如果循环处理每个数据会十分复杂,那么我们如何才能解决这个问题呢?Numpy 的数组运算便可以解决这些大数据处理问题。Numpy 无需循环,支持对整组数据进行快速运算。
Numpy 数组运算的法则与常量运算等基本一致,但是 Numpy 数组具有一种特殊的机制——广播机制
。在学习 Numpy 数组运算前我们一定要先简单了解一下广播机制,才能更好地帮助我们理解运算的底层逻辑。
下面我们就先一起学习一下 Numpy 的广播机制。
1. Numpy的广播机制
简单来说就是将数组元素少的数组扩充到和数组元素多的数组一样大小的机制,通过广播的形式将两个数组转化为形状相同的两个数组进行运算。
到这是不是还能理解(不就是把两个数组变成形状一样的进行运算嘛)?
广播机制的原则是如果两个数组的从后数第一个维度轴长度相符或其中一个数组的轴长为 1,则认为它们能够广播。广播会在缺失维度和(或)轴长度为 1 的维度上进行,即元素较少的数组进行。
额,上面这句话是不是挺懵逼的,什么维度,什么轴长…
其实上面那句话说的就是下面的这三种情况。
1.1 常数
例如:
Arr1=np.array([1,2,3])
print(Arr1)
print(Arr1*3)
输出结果为:
[1 2 3]
[3 6 9]
我们对一个一维数组乘3后,整个数组的数据都乘了3,这个广播过程可以用下面的图解释:
当一个数组乘一个常数时,常数会扩展成形状相同的数组,再与对应位置的元素进行运算。
另外一种是两个数组的维度不同,但是从后数第一个维度的轴长相同。
1.2 维度不同,轴长相同
例如:
Arr2=np.array([[1,2,3],[4,5,6]])
Arr1=np.array([1,2,3])
print(Arr1)
print(Arr2)
print(Arr1+Arr2)
输出结果为:
[1 2 3]
[[1 2 3]
[4 5 6]]
[[2 4 6]
[5 7 9]]
两个数组的形状不同,但是却可以进行加法运算。通过下面这个图示,我们可以进一步理解广播机制:
可以发现,当两个维度不同的数组相加时,如果两个数组第一个维度的轴长相同,便可以利用广播机制扩充成形状相同的数组,进而数组中对应位置的数据进行运算。
最后一种是数组的维度相同,但是其中一个轴的长度为 1。
1.3 维度相同,轴长为1
例如:
Arr2=np.array([[1,2,3],[4,5,6]])
Arr=np.array([[1],[2]])
print(Arr2)
print(Arr)
print(Arr2+Arr)
输出结果为:
[[1 2 3]
[4 5 6]]
[[1]
[2]]
[[2 3 4]
[6 7 8]]
这个广播机制是像下面这样的:
我们发现两个数组形状虽然不同,但只要维度相同且一个轴的长度为 1,同样能够利用广播机制扩展为形状相同的数组,并进行数组对应位置上的元素运算。
到这里,我们就已经介绍完了广播机制,广播机制是 Numpy 数组运算的重要机制。只有理解了广播机制,我们才能更好地理解 Numpy 数组的运算。
下面就将开始 Numpy 数组运算的学习,我们将会从标量运算与数组运算的关系
、数组的基本运算
来介绍 Numpy 数组的运算。
2. 标量运算与数组运算的关系
标量就是一个常数,一句话概括:
标量与数组的运算法则是数组的每一项都和该标量进行运算。
也就是上面说到的常数的广播机制。
3. 数组的基本运算
数组的基本运算主要包括以下几种:
- 四则运算(加减乘除)
- 取余
- 比较运算(类似布尔运算输出一个布尔结果)
直接上例子:
import numpy as np
Score1=np.array([[38,90,78],[46,66,98],[65,100,55],[46,26,32],[88,45,65]])
Score2=np.array([[38,96,78],[55,76,98],[40,45,99],[46,67,45],[78,30,65]])
# 四则运算,取余运算
print('不同同学两次成绩的和为:',Score1+Score2)
print('不同同学两次成绩的为差:',Score1-Score2)
print('不同同学两次成绩的商为:',(Score1/Score2).astype(float))
print('不同同学两次成绩的积为:',Score1*Score2)
print('对第一次同学的成绩进行取余2为:',Score1%2)
# 比较运算
print('查看成绩是否下降:',Score1>Score2)
print('查看成绩是否上升:',Score1<Score2)
print('查看成绩是否持平,无波动:',Score1==Score2)
print('查看成绩是否持平,无波动:',Score1!=Score2)
运算法则都是一样的,都是数组中相应位置的元素进行运算。当两个数组形状不同时,若符合广播机制,同样是遵循这样的法则。
4. 总结
- Numpy中的广播机制是什么?有哪三种?
- Numpy标量运算与数组运算的关系?和广播机制有什么关系?
- Numpy中数组的基本运算有哪些?
我是张小yu,创作不易,请多关照。stay hungry,stay foolish。