一维数组
一维数组很简单,基本和列表一致。
它们的区别在于数组切片是原始数组视图(这就意味着,如果做任何修改,原始都会跟着更改)。
这也意味着,如果不想更改原始数组,我们需要进行显式的复制,从而得到它的副本(.copy())。
二维数组
二维数组中,各索引位置上的元素不再是标量,而是一维数组(好像很难理解哈)。
好像很难理解,是吧。
那这样看:
想到了什么?咱们当做一个平面直角坐标系。
相当于arr1[x,y],x相当于行数,y相当于列数(必须声明,图中x和y标反了,但不影响理解)。
多维数组
先说明下reshape()更改形状:
np.reshape(a,newshape,order='C')
a:array_like以一个数组为参数。
newshape:intortupleofints。整数或者元组
顺便说明下,np.reshape()不更改原数组形状(会生成一个副本)。
其实多维数组就相当于:
row * col * 列中列
那么:
切片索引
那么这样也就很容易的就可以理解下面这种索引了。
切片索引把每一行每一列当做一个列表就可以很容易的理解。
返回的都是数组。
再复杂一点:
我们想要获得下面这个数组第一行的第2,3个数值。
为了得到第2,3个数,我们可以:
可以发现ndarray的切片其实与列表的切片是差不太多的。
我们还可以这样:
布尔型索引
从结果上看,布尔索引取出了布尔值为True的行。
布尔型数组的长度和索引的数组的行数(轴长度)必须一致。
布尔型数组可与切片,整数(整数序列)一起使用。
!= 不等于符号。
~ 负号可以对条件进行否定。logical_not()函数也可以。
组合多个条件,使用布尔运算符&(和),|(或)
通过以上的代码实验,我们也可以发现,布尔索引不更改原数组,创建的都是原数组的副本。
那这个东西能做什么呢?其他索引能做的,他基本也都可以。
比如有这样一个数组:
我们要将arr5大于0的数值变为10:
当然,布尔索引也可以结合上面的运算符来进行操作。
花式索引
花式索引(Fancy indexing),指的是利用整数数组进行索引。
第一次看到这个解释,我是一脸懵的。
试验后,我才理解。
我们可以看到花式索引的结果,以一个特定的顺序排列。
而这个顺序,就是我们所传入的整数列表或者ndarray。
这也为我们以特定的顺序来选取数组子集,提供了思路。
可以看到,花式索引的结果与普通索引是一致的。只不过,花式索引简化了索引过程,而且还实现了按一定的顺序排列。
还可以使用负数(其实类似于列表)进行索引。
一次传入多个索引数组,会返回一个一维数组,其中的元素对应各个索引元组。
有点懵。
经过对比可以发现,返回的一维数组中的元素,分别对应(1,2)、(3,0)....
这一样一下子就清晰了,我们传入来两个索引数组,相当于传入了一组平面坐标,从而进行了定位。
此处,照我这样理解的话,那么一个N维数组,我传入N个索引数组的话,是不是相当于我传入了一个N维坐标。
我试验了下三维,是这样的,但是以后的不知道了。谁知道求告诉。
那么应该如何得到一个矩形区域呢。可以这样做:
必须明白,arr7[2][3]等价于arr7[2,3]
那么上面这种得到矩形区域的方法,就相当于行与列去了交集。
此外还可用np.ix_函数,它的作用与上面的方法类似,只不过是将两个一维的数组转换为了一个可以选择矩形区域的索引器。
通过,这些试验,还可发现,花式索引将数据复制到了一个新的数组中。
总结
以上就是本文关于numpy中索引和切片详解的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
原文链接:http://www.cnblogs.com/sunshinewang/p/6882031.html