06_索引和切片

索引和切片

  • 数组切片是原始数组的视图,不是复制品,如果要得到切片的副本,应该使用copy()方法
  • 在多维数组中索引,如果省略了后面的索引,则返回对象会是一个维度低一点的ndarray(它含有高一级维度上的所有数据)

1、切片

切片的基本语法 ndarray[i : j : k],其中i为起始下标,j为结束下标(不包括j),k为步长(默认为1)

import numpy as np

arr = np.arange(10)
arr
>>> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

arr[1:9:2]
>>> array([1, 3, 5, 7])

arr[4:-3]
>>> array([4, 5, 6])

arr[9:4:-2]
>>> array([9, 7, 5])

a = arr[::2]
a
>>> array([0, 2, 4, 6, 8])

arr[:6] = 0
>>> array([0, 0, 0, 0, 0, 0, 6, 7, 8, 9])

arr[6:]
>>> array([6, 7, 8, 9])

arr[:] = 1
arr
>>> array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])


多维切片
ndarr = np.arange(16).reshape((4, 4))
ndarr
>>> array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15]])

ndarr[:2] # 行,等效于arr2[:2, :]
>>> array([[0, 1, 2, 3],
           [4, 5, 6, 7]])

ndarr[:2, :2] # 前两行的前两列
>>> array([[0, 1],
           [4, 5]])

ndarr[:, -2] 
>>> array([ 2, 6, 10, 14])

ndarr[::2, -2] # 步长为2的行的倒数第二列
>>> array([ 2, 10])

2、索引

arr = np.arange(10)
ndarr = np.arange(16).reshape((4, 4))
arr
ndarr
>>> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15]])

arr[1]
>>> 1

ndarr[1,1] # 等效于ndarr[1][1],但是后者速度更慢
>>> 5

ndarr[1][1]
>>> 5

ndarr[2, [1, 2]] # 第2行的第1、2列元素
>>> array([ 9, 10])

ndarr[:3, [0,1]] # 前3行的第0、1列元素
>>> array([[0, 1],
           [4, 5],
           [8, 9]])

布尔索引
cities = np.array(['bj', 'cd', 'sh', 'gz', 'cd'])
cities
>>> array(['bj', 'cd', 'sh', 'gz', 'cd'], dtype='<U2')

data = np.arange(20).reshape(5, 4)
data
>>> array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15],
           [16, 17, 18, 19]])

cities == 'cd'
>>> array([False,  True, False, False,  True])

data[cities == 'cd']
>>> array([[ 4,  5,  6,  7],
           [16, 17, 18, 19]])

data[cities == 'cd', :1]
>>> array([[ 4],
           [16]])

cities != 'cd'
>>> array([ True, False,  True,  True, False])

data[cities != 'cd']  # 等效于 data[~(cities == 'cd')] 
>>> array([[ 0,  1,  2,  3],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15]])

data[cities != 'cd', :1] # 等效于 data[~(cities == 'cd'), :1]
>>> array([[ 0],
           [ 8],
           [12]])

花式索引

指的是利用整数数组进行索引

arr3 = np.arange(36).reshape(6,6) 
arr3
>>> 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]])

# 取出第3,2, 5行
arr3[[3, 4, 5]]
>>> array([[18, 19, 20, 21, 22, 23],
           [24, 25, 26, 27, 28, 29],
           [30, 31, 32, 33, 34, 35]])

# 使用负数索引将会从末尾开始选取行
arr3[[-4, -2 , -1]]
>>> array([[12, 13, 14, 15, 16, 17],
           [24, 25, 26, 27, 28, 29],
           [30, 31, 32, 33, 34, 35]])

arr3[[1, 2, 3], [1, 2, 3]] # 取出下标为(1, 1), (2, 2), (3, 3)的元素 
>>> array([ 7, 14, 21])

arr3[[1, 2, 3]][:, [1, 2, 3]]  # 同时在行和列上进行花式索引
>>> array([[ 7,  8,  9],
           [13, 14, 15],
           [19, 20, 21]])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值