Numpy——ndarray对象(2):数组存取和多维数组
上节介绍了如何利用numpy创建数组,本节将继续介绍存取numpy数组的一系列知识。
首先先了解最基本的存取数组的操作:
>>> a = np.arange(10)
>>> a[5] #通过下标查找对应的元素
5
>>> a[3:5] #切片获取元素,不包括下标为5的元素
array([3, 4])
>>> a[:5]
array([0, 1, 2, 3, 4])
>>> a[:-1] # 下标可以使用负数,表示从数组后往前数,不包括下标-1对应的元素
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
>>> a[2:4] = 100,101 #通过下标修改元素的值
>>> a
array([ 0, 1, 100, 101, 4, 5, 6, 7, 8, 9])
>>> a[1:-1:2] #2表示步长
array([ 1, 101, 5, 7])
>>> a[5:1:-2] #步长为负数时,开始下标必须大于结束下标
array([ 5, 101])
>>> a[::-1]
array([ 9, 8, 7, 6, 5, 4, 101, 100, 1, 0])
和 Python 的列表序列不同,通过下标范围获取的新的数组是原始数组的一个视图。它与原始数组共享同一块数据空间:
>>> b = a[3:7]
>>> b
array([101, 4, 5, 6])
>>> b[2] = -10 #修改切片b中下标为2的值
>>> b
array([101, 4, -10, 6])
>>> a #发现原数组a中下标为5的值也改变为同样的值
array([ 0, 1, 100, 101, 4, -10, 6, 7, 8, 9])
整数序列
当使用整数序列对数组元素进行存取时,将使用整数序列中的每个元素作为下标,整数序列可以是列表或者数组。使用整数序列作为下标获得的数组不和原始数组共享数据空间。
>>> x = np.arange(10,1,-1)
>>> x
array([10, 9, 8, 7, 6, 5, 4, 3, 2])
>>> x[[3,3,1,8]] #获取x中的下标为3,3,1,8的4个元素,组成一个新的数组
array([7, 7, 9, 2])
>>> b = x[np.array([3,3,-3,8])] #序列中可以出现负数
>>> b
array([7, 7, 4, 2])
>>> b[2] = 100 #修改b中下标为2的值
>>> b
array([ 7, 7, 100, 2])
>>> x #由于b和x不共享数据空间,因此x中的值并没有改变
array([10, 9, 8, 7, 6, 5, 4, 3, 2])
>>> x[[3,5,1]] = -1,-2,-3 #整数序列下标也可以用来修改元素的值
>>> x
array([10, -3, 8, -1, 6, -2, 4, 3, 2])
布尔数组
当使用布尔数组b作为下标存取数组x中的元素时,将收集数组x中所有在数组b中对应下标为True的元素。使用布尔数组作为下标获得的数组不和原始数组共享数据空间,注意:这种方式只对应于布尔数组,不能使用布尔列表。
>>> x = np.arange(5,0,-1)
>>> x #不包括终值 0
array([5, 4, 3, 2, 1])
>>> x[np.array([True, False, True, False, False])] #只对应布尔数组
array([5, 3])
>>> x[[True, False, True, False, False]] #如果是布尔列表,则把True当做1,把False当做0,按照整数序列方式获取x中的元素
array([4, 5, 4, 5, 5])
>>> x[np.array([True, False, True, True])] #布尔数组长度不够时,不够的部分当做False
array([5, 3, 2])
>>> x[np.array([True, False, True, True])] = -1,-2,-3 #布尔数组下标也可以用来修改布尔值为Ture的元素
>>> x
array([-1, 4, -2, -3, 1])
布尔数组一般不是手工产生,而是使用布尔运算的 ufunc 函数产生:
>>> x = np.random.rand(10) #生成0到1线性分布的有10个元素的一维数组
>>> x
array([ 0.94064768, 0.25426901, 0.33416374, 0.8496091 , 0.53192659,
0.32129117, 0.10427883, 0.54406614, 0.30589055, 0.54897881])
>>> x > 0.5 #得到一个布尔数组
array([ True, False, False, True, True, False, False, True, False, True], dtype=bool)
>>> x[x > 0.5] #得到x中大于0.5的元素的数组
array([ 0.94064768, 0.8496091 , 0.53192659, 0.54406614, 0.54897881])
多维数组
多维数组的创建:
>>> a0 = np.arange(0,60,10).reshape(-1,1) #生成一个列数组
>>> a0
array([[ 0],
[10],
[20],
[30],
[40],
[50]])
>>> a1 = np.arange(6) #生成同样规模的行数组
>>> a1
array([0, 1, 2, 3, 4, 5])
>>> a = a0 + a1 #相加即得到6行6列的二维数组
>>> a
array([[ 0, 1, 2, 3, 4, 5],
[10, 11, 12, 13, 14, 15],
[20, 21, 22, 23, 24, 25],
[30, 31, 32, 33, 34, 35],
[40, 41, 42, 43, 44, 45],
[50, 51, 52, 53, 54, 55]])
获取多维数组中的对应元素:
>>> a[0,3:5] #取第0行第3到5列的元素,不包含终值下标对应的元素
array([3, 4])
>>> a[4:,4:] #取第4行及其之后和第4列及其之后的所有元素
array([[44, 45],
[54, 55]])
>>> a[:,2] #取所有行第2列的元素
array([ 2, 12, 22, 32, 42, 52])
多维数组同样也可以使用整数序列和布尔数组进行存取:
>>> a[(0,1,2,3,4),(1,2,3,4,5)]
'''
用于存取数组的下标和仍然是一个有两个元素的组元,组元中的每个元素都是整数序列,分别对应数组的第0轴(行)和第1轴(列)。从两个序列的对应位置取出两个整数组成下标: a[0,1], a[1,2], ..., a[4,5]。
'''
array([ 1, 12, 23, 34, 45])
>>> a[3:,[0,2,5]] #取第3行及其之后和第0、2、5列的元素
array([[30, 32, 35],
[40, 42, 45],
[50, 52, 55]])
>>> m = np.array([1,0,1,0,0,1], dtype = np.bool) #设置类型为bool型
>>> a[m,2] #取数组m中为True的行和第2列的元素
array([ 2, 22, 52])
Numpy——ndarray对象(1):创建数组