一 序
本文继续numpy学习。
二 矢量化运算
numpy的数组通常在不用编写循环的情况下进行批量运算。
一维数组
二维数组
其他操作:加减乘除,以乘法做例子
NumPy 广播(Broadcast)
广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。
如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。
当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制
三 NumPy 切片和索引
ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。
ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。
多维数组同样适用上述索引提取方法:
numpy数组比较运算
整数数组索引
以下实例获取数组中(0,0),(1,1)和(2,0)位置处的元素。
布尔索引
我们可以通过一个布尔数组来索引目标数组。
布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。
从数组中过滤掉非复数元素。
花式索引
花式索引指的是利用整数数组进行索引。
花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行。
花式索引跟切片不一样,它总是将数据复制到新数组中。
下面的例子取出8*4矩阵的第4,2,1,7行组成新的数组
注意两个的差异。右侧是第二个索引,(先选行再选列)就是单独指出要的数据所在列的下标。
列式选择:要使用np.ix_
四 Numpy 数组操作
修改数组形状
reshape | 不改变数据的条件下修改形状 |
flat | 数组元素迭代器 |
flatten | 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组 |
ravel | 返回展开数组 |
numpy.reshape
numpy.reshape 函数可以在不改变数据的条件下修改形状,格式如下: numpy.reshape(arr, newshape, order='C')
arr
:要修改形状的数组newshape
:整数或者整数数组,新的形状应当兼容原有形状- order:'C' -- 按行,'F' -- 按列,'A' -- 原顺序,'k' -- 元素在内存中的出现顺序。
翻转数组
函数 | 描述 |
---|---|
transpose | 对换数组的维度 |
ndarray.T | 和 self.transpose() 相同 |
rollaxis | 向后滚动指定的轴 |
swapaxes | 对换数组的两个轴 |
numpy.transpose
numpy.transpose 函数用于对换数组的维度,格式如下:
numpy.transpose(arr, axes)
numpy.ndarray.T 类似 numpy.transpose:不贴例子了
numpy.rollaxis
numpy.rollaxis 函数向后滚动特定的轴到一个特定位置,格式如下:
numpy.rollaxis(arr, axis, start)
参数说明:
arr
:数组axis
:要向后滚动的轴,其它轴的相对位置不会改变start
:默认为零,表示完整的滚动。会滚动到特定位置。
关于轴例子十分抽象,只看概念难理解。我的理解是:给每个数字的编号在纸上画下来。
上面的例子,0(000),1(001),2(010),3(011),4(100),5(101),6(110),7(111)
这个轴2滚动,对于000不变,001->100,010->001,011->101,100->010,101->110,110->011.111不变。
结合这个再看上面的前面数组对比就容易理解了。
注意where:
numpy.where()
numpy.where() 函数返回输入数组中满足给定条件的元素的索引。
where相当于if condition条件成立。