上篇文章咱们讲到了NumPy的建立、算术运算及广播特性。这篇文章咱们将继续学习NumPy。数组
ndarray对象的内容能够经过索引或切片来访问和修改,与 Python 中 list 的切片操做同样。函数
import numpy as np arr = np.arange(10) print(arr) print(arr[5]) print(arr[2:5]) print(arr[5:]) print(arr[:3])
结果以下:学习
区别于Python的内建列表,数组的切片是原数组的视图。这意味着数据并非被复制了,任何对于视图的修改都会反映到原数组上。3d
若是想要数组切片的拷贝而不是视图,就须要显式调用arr[x:y].copy()
。code
ndarray 数组能够基于 0 - n 的下标进行索引,切片对象能够经过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。对象
a = np.arange(10) s = slice(2,7,2) # 从索引 2 开始到索引 7 中止,间隔为2 print (a[s])
在二维数组中,每一个索引值对应的元素再也不是一个值,而是一个一维数组:blog
arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]]) print(arr2d) print(arr2d[2]) # 下面两种方式效果同样 print(arr2d[0][2]) print(arr2d[0, 2])
输出以下:索引
在展现二维数组的索引上,咱们能够将“0”轴看作行,“1”轴看作列。import
思考一下: 下面二维数组的切片意味着什么?基础
print(arr2d[:2]) print(arr2d[:2,1:])
数组沿着轴0进行了切片。表达式arr2d[:2]
的含义为选择arr2d的前两行。
咱们能够经过一个布尔数组来索引目标数组。
布尔索引经过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。
如下实例获取大于 5 的元素:
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]]) print ('咱们的数组是:') print (x) print ('\n') # 如今咱们会打印出大于 5 的元素 print ('大于 5 的元素是:') print (x > 5) print(x[ x > 5 ])
结果以下:
可使用!=
或~
对条件取反。如:
print(x[~(x > 5)])
多个条件并列时,可使用&
或|
进行链接。
神奇索引(花式索引)是NumPy中的术语,用于描述使用整数数组进行数据索引。
花式索引根据索引数组的值做为目标数组的某个轴的下标来取值。
对于使用一维整型数组做为索引,若是目标是一维数组,那么索引的结果就是对应位置的元素;
若是目标是二维数组,那么就是对应下标的行。
花式索引跟切片不同,它老是将数据复制到新数组中。
arr1 = np.arange(32).reshape((8,4)) print(arr1) print("------------1--------------") print(arr1[[4,2,5,1]]) print("------------2--------------") print(arr1[[-2,-1,-5,-3]]) print("------------3--------------") print(arr1[[1,5,7,2],[0,3,1,2]])
结果:
转置是一种特殊的数据重组形式,能够返回底层数据的视图而不须要复制任何内容。
数组拥有transpose方法,也有特殊的T属性。
arr2 = np.arange(15).reshape((3,5)) print("----转置前------") print(arr2) print("----转置后------") print(arr2.T)
arr3 = np.arange(16).reshape((2,2,4)) print("--------转换前-------") print(arr3) print("--------转换后-------") print(arr3.transpose(2,1,0))
转换规则:
0 [0,0,0] [0,0,0] 1 [0,0,1] [1,0,0] 2 [0,0,2] [2,0,0] 3 [0,0,3] [3,0,0] 4 [0,1,0] [0,1,0] 5 [0,1,1] [1,1,0] 6 [0,1,2] [2,1,0] 7 [0,1,3] [3,1,0] 8 [1,0,0] [0,0,1] 9 [1,0,1] [1,0,1] 10 [1,0,2] [2,0,1] 11 [1,0,3] [3,0,1] 12 [1,1,0] [0,1,1] 13 [1,1,1] [1,1,1] 14 [1,1,2] [2,1,1] 15 [1,1,3] [3,1,1]
其中第一列是值,第二列是转置前位置,第三列是转置后,看到转置后位置。
再例如:
print(arr2.transpose(1,0,2))
结果以下:
将轴转换:
0 [0,0,0] [0,0,0] 1 [0,0,1] [0,0,1] 2 [0,0,2] [0,0,2] 3 [0,0,3] [0,0,3] 4 [0,1,0] [1,0,0] 5 [0,1,1] [1,0,1] 6 [0,1,2] [1,0,2] 7 [0,1,3] [1,0,3] 8 [1,0,0] [0,1,0] 9 [1,0,1] [0,1,1] 10 [1,0,2] [0,1,2] 11 [1,0,3] [0,1,3] 12 [1,1,0] [1,1,0] 13 [1,1,1] [1,1,1] 14 [1,1,2] [1,1,2] 15 [1,1,3] [1,1,3]
swapaxes函数用于交换数组的两个轴,格式以下:
numpy.swapaxes(arr, axis1, axis2)
举例:
a = np.arange(8).reshape(2,2,2) print ('原数组:') print (a) print ('\n') print ('调用 swapaxes 函数后的数组:') print (np.swapaxes(a, 2, 0))
结果: