这是一维数组的情况,对于多维数组,要想访问某个具体元素时,必须指定这个元素在每一个维度的索引位置:
data1 = [[[1,2,3],[4,5,6]],[[7,8,9,],[10,11,12]]] data1[1][1][1] Out[85]: 11上述代码中data1是一个2X2X3的三维数组,要想访问11,必须指定三个维度上的索引data1[1][1][1]。
data1[1][1]返回的结果是1维的数组:
data1[1][1] Out[86]: [10, 11, 12]data1[1]返回的是2维的数组:
data1[1] Out[87]: [[7, 8, 9], [10, 11, 12]]data1[1][1][1]和data1[1,1,1]的效果一样,返回的数值都是11。
NumPy提供在ndarray数组上进行切片的操作,返回的是ndarray数组的子视图。
data1 = np.arange(10) data1[1:4] Out[91]: array([1, 2, 3]) data1[:4] Out[92]: array([0, 1, 2, 3]) data1[4:] Out[93]: array([4, 5, 6, 7, 8, 9])data1[1:4]切片操作返回的是从索引1开始,到索引4结束,不包括索引4的元素的数组。
data1[:4]切片操作是从索引0开始,到索引4结束,不包括索引4的元素的数组。
data1[4:]切片操作返回的是从索引4开始到最后一个元素的数组。
切片操作返回的是原数组的视图,不是重新生成一个数组,通过对这个切片做赋值操作,就可以修改原数组对应索引位置上元素的数值:
data1 = np.arange(10) data1[4:]=10 data1 Out[98]: array([ 0, 1, 2, 3, 10, 10, 10, 10, 10, 10])data1数组从索引4开始到最后一个索引9上的元素数值都变为10。
二维及以上的多维数组,也可以支持切片操作,但是比一维数组要复杂些:
data1 = np.array([[1,2,3],[4,5,6],[7,8,9]]) data1 Out[100]: array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) data1[:2] Out[101]: array([[1, 2, 3], [4, 5, 6]]) data1[:2,:2] Out[102]: array([[1, 2], [4, 5]]) data1[:2,1:]多维数组的切片,可在每个维度都进行切片操作。
布尔型数组
顾名思义,布尔型数组就是指数组的元素时布尔值True和False。
变量的比较运算产生的结果是布尔型的,ndarray数组的比较运算也不例外,结果也是布尔类型的,因此可以将一个数字类型或者字符类型的ndarray数字通过比较运算转换为布尔型数组:
data1 = np.array(['Tom','Yong','Jim','John']) data1 == 'Tom' Out[111]: array([ True, False, False, False])上面的代码首先创建一个字符类型的ndarray数组data1,接着对数组进行比较操作,data1 == 'Tom',如果数组中的元素等于'Tom',则返回True,否则返回False。
布尔型数值一个最经常的用法是设置值:
arr = np.random.randn(3,4) arr Out[62]: array([[ 0.52428143, -1.04842533, -1.00102911, -0.86488208], [ 3.20965669, 0.4379931 , -0.82962251, 0.63862152], [-1.03235591, -1.17507334, -0.01953273, -1.13759955]]) arr[arr<0] = 0 arr Out[64]: array([[0.52428143, 0. , 0. , 0. ], [3.20965669, 0.4379931 , 0. , 0.63862152], [0. , 0. , 0. , 0. ]])上面的代码是将arr数组中小于零的元素设置为0。
数组转置
数组转置和线性代数中矩阵转置一样。NumPy提供transpose方法和特殊属性T实现数组转置。
一维数组的转置还是数组本身。
data1 = np.arange(14).reshape(2,7) data1 Out[74]: array([[ 0, 1, 2, 3, 4, 5, 6], [ 7, 8, 9, 10, 11, 12, 13]]) data1.T Out[75]: array([[ 0, 7], [ 1, 8], [ 2, 9], [ 3, 10], [ 4, 11], [ 5, 12], [ 6, 13]])二维数组的转置是将行和列对应位置的元素互相调换。
特殊属性T只适用于一维和二维数组,对于三维以上的数组,必须使用transpose方法才可以实现数组转置。
调用transpose方法时需要传入一个元组,用于指定按照哪些轴进行转置。元组的元素个数和数组的维度要保持一致。如果适合3维数组,那么元组个数也必须是3。
data1 = np.arange(24).reshape(2,3,4) data1 Out[107]: 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]]]) data1.transpose((2,1,0)) Out[108]: array([[[ 0, 12], [ 4, 16], [ 8, 20]], [[ 1, 13], [ 5, 17], [ 9, 21]], [[ 2, 14], [ 6, 18], [10, 22]], [[ 3, 15], [ 7, 19], [11, 23]]])上面代码先是创建一个2x3x4的三维数组,然后调用transpose((2,1,0))方法实现数组转置。data1数组的轴用数字0,1,2表示(类似三维空间中的x,y,z轴)。调用transpose((2,1,0))时,元组(2,1,0)表示将data1的第0轴和第2轴置换,1轴不变。
数组置换返回的是源数据的视图,不会重新生成新的数组。