首页 > 编程 > Python > 正文

numpy中索引和切片详解

2020-02-16 11:07:32
字体:
来源:转载
供稿:网友

索引和切片

一维数组

一维数组很简单,基本和列表一致。

它们的区别在于数组切片是原始数组视图(这就意味着,如果做任何修改,原始都会跟着更改)。

这也意味着,如果不想更改原始数组,我们需要进行显式的复制,从而得到它的副本(.copy())。

import numpy as np #导入numpyarr = np.arange(10) #类似于list的range()arrOut[3]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])arr[4] #索引(注意是从0开始的)Out[4]: 4arr[3:6] #切片Out[6]: array([3, 4, 5])arr_old = arr.copy() #先复制一个副本arr_oldOut[8]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])arr[3:6] = 33arr #可以发现将标量赋值给一个切片时,该值可以传播到整个选区Out[10]: array([ 0, 1, 2, 33, 33, 33, 6, 7, 8, 9])arr_oldOut[11]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

二维数组

二维数组中,各索引位置上的元素不再是标量,而是一维数组(好像很难理解哈)。

arr1 = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])arr1[0]Out[13]: array([1, 2, 3])arr1[1,2]Out[14]: 6

好像很难理解,是吧。

那这样看:

array([[1, 2, 3],    [4, 5, 6],    [7, 8, 9]])

想到了什么?咱们当做一个平面直角坐标系。

相当于arr1[x,y],x相当于行数,y相当于列数(必须声明,图中x和y标反了,但不影响理解)。

多维数组

先说明下reshape()更改形状:

np.reshape(a,newshape,order='C')

a:array_like以一个数组为参数。

newshape:intortupleofints。整数或者元组

顺便说明下,np.reshape()不更改原数组形状(会生成一个副本)。

arr1 = np.arange(12)arr2 = arr1.reshape(2,2,3) #将arr1变为2×2×3数组arr2Out[9]: array([[[ 0, 1, 2],    [ 3, 4, 5]],    [[ 6, 7, 8],    [ 9, 10, 11]]])

其实多维数组就相当于:

row * col * 列中列

那么:

arr2[0]Out[10]: array([[0, 1, 2],    [3, 4, 5]])arr2[1]Out[11]: array([[ 6, 7, 8],    [ 9, 10, 11]])arr2[0,1]Out[12]: array([3, 4, 5])arr2[0] = 23 #赋值arr2Out[15]: array([[[23, 23, 23],    [23, 23, 23]],    [[ 6, 7, 8],    [ 9, 10, 11]]])

切片索引

那么这样也就很容易的就可以理解下面这种索引了。

切片索引把每一行每一列当做一个列表就可以很容易的理解。

返回的都是数组。

再复杂一点:

我们想要获得下面这个数组第一行的第2,3个数值。

arr1 = np.arange(36)#创建一个一维数组。arr2 = arr1.reshape(6,6) #更改数组形状。Out[20]: array([[ 0, 1, 2, 3, 4, 5],    [ 6, 7, 8, 9, 10, 11],    [12, 13, 14, 15, 16, 17],    [18, 19, 20, 21, 22, 23],    [24, 25, 26, 27, 28, 29],    [30, 31, 32, 33, 34, 35]])            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表