数组之所以重要是因为可以进行批量操作而不需要使用任何形式的for循环。NumPy这种特性称为向量化,任何两个相等尺寸的数组中都是用到了逐元素操作的方式。
带有标量计算的算术操作,会把计算参数传递给数组的每一个元素。同尺寸之间的比较会产生一个布尔值的数组,不同尺寸的数组间的操作,将会使用到广播特性。所谓广播就是NumPy对于不同尺寸数组进行数值运算的方式。广播的规则是如果对于每个结尾维度(即从尾部开始的),轴长度都匹配或者长度都为1,两个二维数据就是可以兼容广播的,之后,广播会在丢失的或长度为1的轴上进行。示例如下:
1 | import numpy as np |
NumPy中数组也支持切片操作,相当于选择数组中的一部分,不过数组的切片是原数组的视图,这意味着修改数据不是被复制了,而是对与原数组的修改。
1 | arr2 = np.array([x for x in range(10)]) |
不写切片值的[:]将会操作整个数组,如果相要数组切片的copy而不是一份视图,应该显式的调用copy函数,进行切片的复制。如果要访问某个位置的元素对于高维数组可以传递多个索引,也可以使用索引的逗号分隔列表选择单个元素。当然对于多维数组而言,可以省略后续索引值,返回的对象僵尸降低一个维度的数组。需要注意的时候,返回的数组都是视图。(可以将0轴作为行,1轴作为列)如下:
1 | arr2 = np.array([x for x in range(10)]) |
切片方式也可以使用索引的形式,在索引与切片混合,可以得到低纬度的切片。注意单独的一个冒号表示选择整个轴上的数组。示例如下:
1 | arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]]) |
bool索引,在索引数组时可以传入布尔值数组,布尔值数组的长度必须和数组轴索引长度一致。~符号表示对一个通用操作表示取反。bool索引数组中为true的那一行数据会被复制,但是注意当bool数组的长度与索引长度不一致时,可能会到处一些问题。但不会报错。还有一点就是 and or对bool数组没有效果,但是可以使用& 和 | 代替。示例如下:
1 | names = np.array(["bob",'joe','jack','lll']) |
神奇索引是NumPy中的术语,用于描述使用整数数组进行数据索引。为了选出一个符合特定顺序的子集,可以通过传递一个包含指明所需顺序的列表或数组完成。传递多维数组,会根据每个索引元组对应的元素选出一个一维数组。它是将数据复制,而不是使用视图。如下:
1 | arr = np.arange(32).reshape(8,4) |
数组的转职使用transpose()函数,或者直接使用属性T,计算矩阵的内积使用np.dot()函数,使用ndarray的swapaxes方法,可以重组数据,swapaxes返回的视图而不是copy。示例代码如下:
1 | arr = np.arange(15).reshape((3,5)) |