
5.2.1 基本运算
1.数组元素的获取
要获取数组中元素的值,可以使用数组的item()方法。item()方法的格式如下:
item(*args)
其中args可以取一个整数,或用索引来确定,当取一个整数时,把数组当作一维数组处理。另外还可以用for循环输出数组中所有数据,例如下面的代码。

2.数组的四则运算
数组之间的加、减、乘、除等运算是基于数组的元素进行的,要求两个数组的形状相同,如果不同则通过广播机制调整成形状相同。具体示例如下面的代码所示。

3.广播
两个数组进行四则运算时,如果两个数组形状相同则对应元素进行运算;如果两个数组的形状不同,在满足一定条件时,NumPy会自动重复复制现有值,使其形状相同后再进行计算,这是通过内部广播来实现的。下面的代码中x1和y1的形状不同,通过将x1和y1重复复制后,会得到与x2和y2相同的数组,再进行数组元素之间的运算。

NumPy中的广播机制的处理原则如下所示。
(1)让所有输入数组都向其中形状最复杂的数组看齐,形状中不足的部分都通过在前面加1补齐。例如形状是(3,)和(4,3)的两个数组相加时,需要把形状是(3,)的数组调整成(1,3)。
(2)输出数组的形状是输入数组形状的各个维度上的最大值。
(3)如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为1,这个数组能够用来计算,否则出错。例如两个形状分别是(3,)和(3,2)的数组就不能直接相加。
(4)当输入数组的某个维度的长度为1时,沿着此维度运算时都用此维度上的第一组值。
图5-3所示为两个形状不同的数组a和b进行相加时,数组b如何通过广播与数组a兼容。

图5-3 广播机制
NumPy的broadcast_to(array,shape,subok=False)函数可以将数组通过广播机制调整到指定的形状,返回调整后的数组,原数组不变;broadcast_shapes()函数可以通过广播将多个形状调整到最后的形状。例如下面的代码。

4.数组的点乘和叉乘
两个数组之间用“@”符号完成矩阵的点乘运算,也可以用数组或NumPy的dot()方法完成点乘运算。叉乘计算需要用NumPy的cross()方法来完成,cross()方法的格式如下:
cross(a,b,axisa=-1,axisb=-1,axisc=-1,axis=None)
其中,a和b是数组、列表或元组。如果是数组,需要用axisa和axisb指定a和b的哪个轴进行叉乘计算,默认是最后一个轴;axisc是存放返回结果的轴。如果指定axis,则用axis的值取代axisa、axisb和axisc的值,例如下面的代码。

5.数组的四舍五入运算
NumPy的around()、round_()和round()函数可以对元素进行指定精度的四舍五入运算,它们的格式如下:
around(a,decimals=0,out=None) round_(a,decimals=0,out=None) round(a,decimals=0,out=None)
其中,a是数组、列表或元组;decimals可以取正整数、负整数或0,decimals是正整数时,表示保留的小数点后的位数,是负整数时,表示小数点左边的取整位置;out用于保留输出的结果。
