索引和切片
一维数组
一维数组很简单,基本和列表一致。
它们的区别在于数组切片是原始数组视图(这就意味着,如果做任何修改,原始都会跟着更改)。
这也意味着,如果不想更改原始数组,我们需要进行显式的复制,从而得到它的副本(.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]])
新闻热点
疑难解答