Numpy系列(四)- 索引和切片
Python 中原生的数组就支持使用方括号([])进行索引和切片操作,Numpy 自然不会放过这个强大的特性。
单个元素索引
1-D数组的单元素索引是人们期望的。它的工作原理与其他标准Python序列一样。它是从0开始的,并且接受负索引来从数组的结尾进行索引。
import numpy as np
a = np.arange(10)
a
Out[130]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
a[3]
Out[131]: 3
a[-2]
Out[132]: 8
与Python原生的列表、元组不同的是,Numpy数组支持多维数组的多维索引。
a.shape
Out[133]: (10,)
a.resize(2, 5)
a
Out[135]:
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
a[0, 1]
Out[136]: 1
a[1, 2]
Out[137]: 7
a[1]
Out[138]: array([5, 6, 7, 8, 9])
a[1][2]
Out[139]: 7
x[1,-1] 的结果等于 x[1][-1],但是第二种情况效率更低,因为第二种方式创建了一个临时数组。
切片支持
可以使用切片和步长来截取不同长度的数组,使用方式与Python原生的对列表和元组的方式相同。
x = np.arange(10)
x[2:5]
Out[140]: array([2, 3, 4])
x[2:5]
Out[141]: array([2, 3, 4])
x[:-2]
Out[142]: array([0, 1, 2, 3, 4, 5, 6, 7])
x[1:7:2]
Out[143]: array([1, 3, 5])
y = np.arange(35).reshape(5,7)
y
Out[144]:
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]])
y[1:5:2,:3]
Out[145]:
array([[ 7, 8, 9],
[21, 22, 23]])
y[1:5:2,::3]
Out[146]:
array([[ 7, 10, 13],
[21, 24, 27]])
注意:使用切片不会复制内部数组数据,但也会生成原始数据的新视图。
索引数组
Numpy数组可以被其他数组索引。对于索引数组的所有情况,返回的是原始数据的副本,而不是一个获取切片的视图。
索引数组必须是整数类型。
x = np.arange(10,1,-1)
x
Out[147]: array([10, 9, 8, 7, 6, 5, 4, 3, 2])
x[np.array([1,3,4,])]
Out[148]: array([9, 7, 6])
使用索引数组来对被索引数组进行索引后,会生成一个与索引数组形状相同的新数组,只是这个新数组的值会用被索引数组中对应索引的值替代。
x[np.array([3, 3, 1, 8])]
布尔索引数组
使用(整数)索引列表时,需要提供要选择的索引列表,最后生成的结果形状与索引数组形状相同;但是在使用布尔索引时,布尔数组必须与要编制索引的数组的初始维度具有相同的形状。在最直接的情况下,布尔数组具有相同的形状:
y
Out[149]:
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]])
b = y>20
b
Out[150]:
array([[False, False, False, False, False, False, False],
[False, False, False, False, False, False, False],
[False, False, False, False, False, False, False],
[ True, True, True, True, True, True, True],
[ True, True, True, True, True, True, True]])
y[b]
Out[151]: array([21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34])
y[y>20]
Out[152]: array([21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34])
与整数索引数组的情况不同,在布尔数组中,结果是1-D数组,其包含索引数组中的所有元素,对应于布尔数组中的所有真实元素。索引数组中的元素始终以行优先(C样式)顺序进行迭代和返回。结果也与y[np.nonzero(b)]
相同。与索引数组一样,返回的是数据的副本,而不是一个获取切片的视图。
如果y比b的维数更高,则结果将是多维的。例如:
b[:,5]
Out[153]: array([False, False, False, True, True])
y[b[:,5]]
Out[154]:
array([[21, 22, 23, 24, 25, 26, 27],
[28, 29, 30, 31, 32, 33, 34]])
结构化索引工具
为了便于数组形状与表达式和赋值关系的匹配,可以在数组索引中使用np.newaxis对象来添加大小为1的新维。例如
y.shape
Out[155]: (5, 7)
y[:,np.newaxis,:].shape
Out[157]: (5, 1, 7)
注意,在数组中没有新的元素,只是维度增加。这可以方便地以一种方式组合两个数组,否则将需要明确重塑操作。例如:
x = np.arange(5)
x
Out[158]: array([0, 1, 2, 3, 4])
x[:,np.newaxis] + x[np.newaxis,:]
Out[159]:
array([[0, 1, 2, 3, 4],
[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7],
[4, 5, 6, 7, 8]])
省略语法(三个点)可以用于指示完全选择任何剩余的未指定维度。如果数组z的形状是(3,3,3,3),那么z[1,...,2]等效于z[1,:,:,2]。例如:
z = np.arange(81).reshape(3,3,3,3)
z
Out[160]:
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]],
[[36, 37, 38],
[39, 40, 41],
[42, 43, 44]],
[[45, 46, 47],
[48, 49, 50],
[51, 52, 53]]],
[[[54, 55, 56],
[57, 58, 59],
[60, 61, 62]],
[[63, 64, 65],
[66, 67, 68],
[69, 70, 71]],
[[72, 73, 74],
[75, 76, 77],
[78, 79, 80]]]])
z[1,...,2]
Out[161]:
array([[29, 32, 35],
[38, 41, 44],
[47, 50, 53]])
z[1,:,:,2]
Out[162]:
array([[29, 32, 35],
[38, 41, 44],
[47, 50, 53]])
给被索引的数组赋值
可以使用单个索引,切片,索引和布尔数组来选择数组的子集来分配。分配给索引数组的值必须是形状一致的(相同的形状或可广播到索引产生的形状)。例如,允许为切片分配常量:
x = np.arange(10)
x[2:7]
Out[163]: array([2, 3, 4, 5, 6])
x[2:7] = np.arange(5)
x
Out[164]: array([0, 1, 0, 1, 2, 3, 4, 7, 8, 9])
Numpy系列(四)- 索引和切片的更多相关文章
- numpy数组的索引和切片
numpy数组的索引和切片 基本切片操作 >>> import numpy as np >>> arr=np.arange(10) >>> arr ...
- 利用Python进行数据分析(5) NumPy基础: ndarray索引和切片
概念理解 索引即通过一个无符号整数值获取数组里的值. 切片即对数组里某个片段的描述. 一维数组 一维数组的索引 一维数组的索引和Python列表的功能类似: 一维数组的切片 一维数组的切片语法格式为a ...
- 3.4Python数据处理篇之Numpy系列(四)---ndarray 数组的运算
目录 目录 (一)数组与标量的运算 1.说明: 2.实例: (二)元素级的运算(一元函数) 1.说明: 2.实例: (三)数组级的运算(二元函数) 1.说明: 2.实例: 目录 1.数组与标量的运算 ...
- NumPy学习(索引和切片,合并,分割,copy与deep copy)
NumPy学习(索引和切片,合并,分割,copy与deep copy) 目录 索引和切片 合并 分割 copy与deep copy 索引和切片 通过索引和切片可以访问以及修改数组元素的值 一维数组 程 ...
- Numpy:索引与切片
numpy基本的索引和切片 import numpy as np arr = np.array([1,2,3,555,666,888,10]) arr array([ 1, 2, 3, 555, 66 ...
- 3.3Python数据处理篇之Numpy系列(三)---数组的索引与切片
目录 (一)数组的索引与切片 1.说明: 2.实例: (二)多维数组的索引与切片 1.说明: 2.实例: 目录: 1.一维数组的索引与切片 2.多维数组的索引与切片 (一)数组的索引与切片 1.说明: ...
- NumPy 学习 第二篇:索引和切片
数组索引是指使用中括号 [] 来定位数据元素,不仅可以定位到单个元素,也可以定位到多个元素.索引基于0,并接受从数组末尾开始索引的负索引. 举个例子,正向索引从0开始,从数组开始向末尾依次加1递增:负 ...
- Numpy数组基本操作(数组索引,数组切片以及数组的形状,数组的拼接与分裂)
一:数组的属性 每个数组都有它的属性,可分为:ndim(数组的维度),shape(数组每个维度的大小),size(数组的总大小),dtype(数组数据的类型) 二:数组索引 和python列表一样,N ...
- numpy之索引和切片
索引和切片 一维数组 一维数组很简单,基本和列表一致. 它们的区别在于数组切片是原始数组视图(这就意味着,如果做任何修改,原始都会跟着更改). 这也意味着,如果不想更改原始数组,我们需要进行显式的复制 ...
随机推荐
- c:\windows\system32\config\systemprofile\desktop 打不开
Question 重启开机后显示桌面打不开: 再次重启后无效 Solution 打开注册表regedit如下路径,复制Desktop值到 同路径下的Desktop中,再重启.
- python3字符串格式化format()函数的简单用法
format()函数 """ 测试 format()函数 """ def testFormat(): # format()函数中有几个元素, ...
- 浅谈百度地图API的坑
我们可以使用百度地图生成器生成地图码(功能开发 还是使用官方文档吧) 注意百度地图坑 1.地图和我们申请的ak码版本问题 (解决方案:推荐大家使用2.0) 远程链接:<script type=& ...
- 删除网络中的本地连接*x等
1.运行-regedit 打开注册表 定位到 HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Control Network {4D36E972-E325-11 ...
- 《PHP扩展及核心》
本文地址:http://www.cnblogs.com/aiweixiao/p/8202365.html 原文地址: 欢迎关注微信公众号 程序员的文娱情怀 一.主要内容: 1️⃣php扩展的概念和底 ...
- 初识服务发现及Consul框架的简单使用
初识服务发现及Consul框架的简单使用 1.什么是服务发现? 服务发现组件记录了(大规模)分布式系统中所有服务的信息,人们或者其它服务可以据此找到这些服务. DNS 就是一个简单的例子. 当然, ...
- MD5加密加盐
Java实现MD5的随机加盐加密,这样以来就很难解密了,必须使用原密码才能正常的登录系统了,以下为Java实现的MD5随机加盐加密,以及使用Apache的Hex类实现Hex(16进制字符串和)和字节数 ...
- 早上一起来,就看到朋友圈发这个,慌的一 B
早上一起来,就看到朋友圈发这个,慌的一 B,也不知道是真是假- 图中的 c 表示已被确认,大家可以看到各个大厂真的是在大幅度裁员. 不知道明年的情况会如何,网上看到过一句话:2019 年也许是这 10 ...
- OI用语一览表
术语 含义 A/AC 通过 AAA树 Top-tree ABC AtCoder Beginner Contest AFO 退役 AG 银牌 AGC AtCoder Grand Contest AK 通 ...
- OpenStack-Nova(4)
一. Nova概述 使用OpenStack Compute来托管和管理云计算系统.OpenStack Compute是基础架构即服务(IaaS)系统的主要部分.主要模块在Python中实现. Open ...