数组很重要,因为它使你不用编写循环即可对数据执行批量运算。这通常就叫做矢量化(vectorization)。大小相等的数组之间的任何算术运算都会将运算应用到元素级:
同样,数组与标量的算术运算也会将那个标量值传播到各个元素:(这里的标量是指一个具体的值)
基本的索引和切片NumPy数组的索引是一个内容丰富的主题,因为选取数据子集或单个元素的方式有很多。一维数组很简单。从表面上看,它们跟Python列表的功能差不多:
当你将一个标量值赋值给一个切片时(如arr[5:8]=12),该值会自动传播(也就说后面将会讲到的“广播”)到整个选区。跟列表最重要的区别在于,数组切片是原始数组的视图。这意味着数据不会被复制,视图上的任何修改都会直接反映到源数组上:
改变arry2元素的值,源数组数据随即改变
由于NumPy的设计目的是处理大数据,所以你可以想象一下,假如NumPy坚持要将数据复制来复制去的话会产生何等的性能和内存问题。
对于高维度数组,能做的事情更多。在一个二维数组中,各索引位置上的元素不再是标量而是一维数组:
因此,可以对各个元素进行递归访问,但这样需要做的事情有点多。你可以传入一个以逗号隔开的索引列表来选取单个元素。
上例中arry1[1,3]等效于arry1[1][3]
二维数组的索引方式:
在多维数组中,如果省略了后面的索引,则返回对象会是一个维度低一点的ndarray(它含有高一级维度上的所有数据)。因此,在2×2×3数组array1中,array1[0]是一个2*3的数组:
标量值和数组都可以被赋值给array1[0]:(数据接上图)
切片索引
切片沿着第0轴(即第一个轴)切片的。也就是说,切片是沿着一个轴向选取元素的。你可以一次传入多个切片,就像传入多个索引那样:
传入多个切片索引,三维数据可在一个表达示中切三次,两维数据切两次,最后一次就是具体的元素了!
“只有冒号”表示选取整个轴,因此你可以像下面这样只对高维轴进行切片: