3 数组的基本运算
数组的算术运算是按元素逐个运算。数组运算后将创建包含运算结果的新数组。
与其他矩阵语言不同,NumPy中的乘法运算符*按元素逐个计算,矩阵乘法可以使用dot函数或创建矩阵对象实现(后续介绍)
2.2.3.1 数组的加减运算
>>> a= np.array([20,30,40,50]) >>> b= np.arange( 4) >>> b array([0, 1, 2, 3]) >>> c= a-b >>> c array([20, 29, 38, 47]) |
将运算结果更新原数组,不创建新数组
>>> a= np.ones((2,3), dtype=int) >>> b= np.random.random((2,3)) ##生成2*3矩阵,元素为[0,1)范围的随机数 >>> a*= 3 >>> a array([[3, 3, 3], [3, 3, 3]]) >>> b+= a #a转换为浮点类型相加 >>> b array([[ 3.69092703, 3.8324276, 3.0114541], [ 3.18679111, 3.3039349, 3.37600289]]) >>> a+= b # b转换为整数类型报错 TypeError: Cannot cast ufunc add output from dtype('float64') to dtype('int32') with casting rule 'same_kind'
|
当数组中存储的是不同类型的元素时,数组将使用占用更多位(bit)的数据类型作为其本身的数据类型,也就是偏向更精确的数据类型(这种行为叫做upcast)。
>>> a= np.ones(3, dtype=np.int32) >>> b= np.linspace(0,np.pi,3) >>> b.dtype.name 'float64' >>> c= a+b >>> c array([ 1., 2.57079633, 4.14159265]) >>> 'float64'
|
2.2.3.2 数组乘法运算
>>>b=np.arange(4) array([0,1,2,3]) >>> b**2 array([0, 1, 4, 9]) >>> 10*np.sin(a) array([ 9.12945251,-9.88031624, 7.4511316, -2.62374854]) >>> a<35 array([True, True, False, False], dtype=bool) |
2.2.3.3 数组内部运算
许多非数组运算,如计算数组所有元素之和,都作为ndarray类的方法来实现,使用时需要用ndarray类的实例来调用这些方法。
二维数组:
>>> np.sum([[0, 1], [0, 5]]) 6 //求所有元素的和 >>> np.sum([[0, 1], [0, 5]], axis=0) array([0, 6]) //求各列的和 >>> np.sum([[0, 1], [0, 5]], axis=1) array([1, 5]) //求各行的和
|
>>> b= np.arange(12).reshape(3,4) >>> b array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> b.sum(axis=0) # 计算每一列的和 array([12, 15, 18, 21]) >>> b.min(axis=1) # 获取每一行的最小值 array([0, 4, 8]) >>> b.cumsum(axis=1) # 计算每一行的累积和 array([[ 0, 1, 3, 6], [ 4, 9, 15, 22], [ 8, 17, 27, 38]]) |
三维数组:
>>> x 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], [24, 25, 26]]]) >>> x.sum(axis=1) array([[ 9, 12, 15], [36, 39, 42], [63, 66, 69]]) >>> x.sum(axis=2) array([[ 3, 12, 21], [30, 39, 48], [57, 66, 75]]) |
求元素最值
>>> a= np.random.random((2,3)) >>> a array([[ 0.65806048, 0.58216761, 0.59986935],[ 0.6004008, 0.41965453, 0.71487337]]) >>> a.sum() 3.5750261436902333 >>> a.min() 0.41965453489104032 >>> a.max() 0.71487337095581649 |