数组切分
上面讲了使用栈操作把多个数组组装到一起的方法。接下来看一下它的逆操作:把一个数组分为及部分。在NumPy中,该操作要用到切分方法。同理,我们也有一组函数,水平切分用hsplit( )函数,垂直切分用vsplit( )函数。
水平切分数组的意思是把数组按照宽度切分成两部分,例如4x4矩阵将被切分为两个4x2的矩阵。
反之,垂直切分指的是将数组按照高度分为两部分,如4x4矩阵将被切分为两个2x4矩阵。
split( )函数更为复杂,可以把数组分为几个不对称的分布。此外,除了传入数组作为参数外,还得指定被切分部分的索引。如果指定axis=1项,索引为列索引;如果axis=0,索引为行索引。
例如,要把矩阵切分为三部分,第一部分为第一列,第二部分为第二列、第三列,而第三部分为最后一列。你需要像下面这样指定索引值。
你也可以按行切分,方法相同。
基本概念
我们将介绍NumPy库中的几个常用概念。我们会讲解副本和视图的区别,其中着重讲解两者返回值的不同点。我们还会介绍NumPy函数的很多事务隐式使用的广播机制。
对象的副本或视图
你可能已经注意到了,NumPy中,尤其是在做数组运算或数组操作时,返回结果不是数组的副本就是视图。NumPy中,所有赋值运算不会为数组和数组中的任何元素创建副本。
把数组a赋给数组b,实际上不是为a创建副本,b只不过是调用数组a的另一种方式。事实上,修改a的第三个元素,同样也会修改b的第三个元素。数组的切片操作返回的对象只是原数组的视图.
如上所见,即使是切片操作得到的结果,实际上仍指向相同的对象。如果想为原数组生成一份完整的副本,从而得到一个不同的数组,使用copy( )函数即可。
上面的例子中,即使改动数组a的元素,数组c仍保持不变。
向量化
向量化和广播这两个概念是NumPy内部实现的基础。有了向量化,编写代码时无需使用显式循环。这些循环实际上不能省略,只不过是在内部实现,被代码中的其他结构代替。向量化的应用使得代码更加简洁,可读性更强,你可以说使用了向量化方法的代码看上去更“pythonic”。向量化使得很多运算看上去更像数学表达式,例如,NumPy中两个数组相乘可以表示为a*b;甚至两个矩阵相乘也可以表示为:A*B;而其他的语言则需要使用for循环结构。比如我们的c++语言结构就需要使用双层的for循环,才能够计算出数组的值:
由此可见,使用NumPy时,代码的可读性更强,其表达式更像是数学表达式。
举报/反馈

一起学python

210获赞 550粉丝
python初学者,记录自己学习python的过程
关注
0
0
收藏
分享