Numpy——ndarray对象(2):数组存取和多维数组

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,84个元素,组成一个新的数组
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                               #相加即得到66列的二维数组
>>> 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行第35列的元素,不包含终值下标对应的元素
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):创建数组

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值