numpy教程04---ndarray的索引
欢迎关注公众号【Python开发实战】, 获取更多内容!

工具-numpy
numpy是使用Python进行数据科学的基础库。numpy以一个强大的N维数组对象为中心,它还包含有用的线性代数,傅里叶变换和随机数函数。
一维ndarray
导入numpy
import numpy as np
一维ndarray的访问和常规的Python数组类似。
a = np.array([1, 5, 3, 19, 13, 7, 3])
a[3]
输出:
19
a[2:5]
输出:
array([ 3, 19, 13])
a[2:-1]
输出:
array([ 3, 19, 13, 7])
a[:2]
输出:
array([1, 5])
a[2::2]
输出:
array([ 3, 13, 3])
a[::-1]
输出:
array([ 3, 7, 13, 19, 3, 5, 1])
当然,也可以修改ndarray的元素。
a[3] = 999
a
输出:
array([ 1, 5, 3, 999, 13, 7, 3])
也可以修改一个ndarray的切片。
a[2:5] = [997, 998, 999]
a
输出:
array([ 1, 5, 997, 998, 999, 7, 3])
与常规数组的区别
与常规Python数组相反,如果将一个值赋给一个ndarray切片,则整个切片里的元素都会被赋值为这个值,这是由于广播机制。
a[2:5] = -1
a
输出:
array([ 1, 5, -1, -1, -1, 7, 3])
另外,不能以这种方式增加或缩小ndarray。
try:
a[2:5] = [1, 2, 3, 4, 5, 6]
except ValueError as e:
print(e)
输出:
cannot copy sequence with size 6 to array axis with dimension 3
也不能删除元素。
try:
del a[2:5]
except ValueError as e:
print(e)
输出:
cannot delete array elements
值得注意的是,ndarray切片实际上是同一数据缓冲区上的视图。这就意味着,如果创建一个切片并对其进行修改,也将会修改原始的ndarray。
a_slice = a[2:6]
a_slice[1] = 1000
a # 原始ndarray也被修改!
输出:
array([ 1, 5, -1, 1000, -1, 7, 3])
a[3] = 2000
a_slice # 修改切片也会修改原始ndarray!
输出:
array([ -1, 2000, -1, 7])
如果想复制ndarray的数据,需要使用copy方法。
another_slice = a[2:6].copy()
another_slice[1] = 3000
a # 原始ndarray不变
输出:
array([ 1, 5, -1, 2000, -1, 7, 3])
a[3] = 4000
another_slice # 修改原始ndarray不会影响切片的副本
输出:
array([ -1, 3000, -1, 7])
多维ndarray
多维ndarray的访问也是类似的方式,通过为每个轴提供索引或切片的形式,不同轴之间的索引或切片用逗号分隔。
b = np.arange(48).reshape(4, 12)
b
输出:
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]])
b[1, 2] # 第1行 第2列
输出:
14
b[1, :] # 第1行的所有列元素
输出:
array([12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])
b[:, 1] # 第1列的所有行元素
输出:
array([ 1, 13, 25, 37])
注意!注意下面两个结果间的细微差别。
b[1, :]
输出:
array([12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])
b[1:2, :]
输出:
array([[12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]])
第一个结果是将第1行作为一个形状为(12,)的一维数组返回,第二个结果是将第1行作为形状为(1,12)的二维数组返回。
花式索引
还可以指定感兴趣的索引列表,被称为花式索引。
b[(0, 2), 2:5]
输出:
array([[ 2, 3, 4],
[26, 27, 28]])
b[:, (-1, 2, -1)]
输出:
array([[11, 2, 11],
[23, 14, 23],
[35, 26, 35],
[47, 38, 47]])
如果提供多个索引数组,将会得到一个一维ndarray,其中包含指定坐标处元素的值。
b[(-1, 2, -1, 2), (5, 9, 1, 9)] # 返回由b[-1, 5] b[2, 9] b[-1, 1] b[2, 9]组成的一维数组
输出:
array([41, 33, 37, 33])
更高维数组
对于更高维数组,上面的索引方式也满足。
c = b.reshape(4, 2, 6)
c
输出:
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]]])
c[2, 1, 4]
输出:
34
c[2, :, 3]
输出:
array([27, 33])
如果省略某些轴的坐标,则会返回这些轴中的所有元素。
c[2, 1]
输出:
array([30, 31, 32, 33, 34, 35])
省略号
也可以使用一个省略号...,表示将所有未指定的轴的元素全部包含在内。
c[2, ...] # 相当于c[2, :, :]
输出:
array([[24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35]])
c[2, 1, ...] # 相当于c[2, 1, :]
输出:
array([30, 31, 32, 33, 34, 35])
c[2, ..., 3] # 相当于c[2, :, 3]
输出:
array([27, 33])
c[..., 3] # 相当于c[:, :, 3]
输出:
array([[ 3, 9],
[15, 21],
[27, 33],
[39, 45]])
布尔索引
还可以在一个轴上提供一系列布尔值,来指定要访问的索引。
d = np.arange(48).reshape(4, 12)
d
输出:
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]])
rows_on = np.array([True, False, True, False])
b[rows_on, :] # 相当于b[(0, 2), :]
输出:
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
[24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]])
cols_on = np.array([False, True, False] * 4)
b[:, cols_on] # 相当于b[:, (1, 4, 7, 10)]
输出:
array([[ 1, 4, 7, 10],
[13, 16, 19, 22],
[25, 28, 31, 34],
[37, 40, 43, 46]])
np.ix_
不能以上面那种方式在多个轴上使用布尔索引,但是可以使用np.ix_函数来解决。
d[np.ix_(rows_on, cols_on)]
输出:
array([[ 1, 4, 7, 10],
[25, 28, 31, 34]])
np.ix_(rows_on, cols_on)
输出:
(array([[0],
[2]], dtype=int64), array([[ 1, 4, 7, 10]], dtype=int64))
如果使用与ndarray形状相同的布尔数组,会得到一个一维数组,该数组包含所有坐标为True的元素值,通常与条件运算符一起使用。
b[b % 3 == 1]
输出:
array([ 1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46])
numpy教程04---ndarray的索引的更多相关文章
- 转:Numpy教程
因为用到theano写函数的时候饱受数据结构困扰 于是上网找了一篇numpy教程(theano的数据类型是基于numpy的) 原文排版更好,阅读体验更佳: http://phddreamer.blog ...
- Python 机器学习库 NumPy 教程
0 Numpy简单介绍 Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy.matplotlib一起使用.其实,list已经提供了类似于矩阵的表示形式,不过numpy ...
- numpy教程
[转]CS231n课程笔记翻译:Python Numpy教程 原文链接:https://zhuanlan.zhihu.com/p/20878530 译者注:本文智能单元首发,翻译自斯坦福CS231n课 ...
- NumPy 教程目录
NumPy 教程目录 1 Lesson1--NumPy NumPy 安装 2 Lesson2--NumPy Ndarray 对象 3 Lesson3--NumPy 数据类型 4 Lesson4--Nu ...
- Mysql实战45讲 04讲深入浅出索引(上)读书笔记 极客时间
极客时间 Mysql实战45讲 04讲深入浅出索引 极客时间(上)读书笔记 笔记体悟 1.索引的作用:提高数据查询效率2.常见索引模型:哈希表.有序数组.搜索树3.哈希表:键 - 值(key - v ...
- [译]Vulkan教程(04)基础代码
[译]Vulkan教程(04)基础代码 General structure 通用结构 In the previous chapter you've created a Vulkan project w ...
- 【GStreamer开发】GStreamer播放教程04——既看式流
目的 在<GStreamer基础教程--流>里面我们展示了如何在较差的网络条件下使用缓冲这个机制来提升用户体验.本教程在<GStreamer基础教程--流>的基础上在扩展了一下 ...
- Elasticsearch入门教程(三):Elasticsearch索引&映射
原文:Elasticsearch入门教程(三):Elasticsearch索引&映射 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文 ...
- 【转】numpy教程
[转载说明] 本来没有必要转载的,只是网上的版本排版不是太好,看的不舒服.所以转过来,重新排版,便于自己查看. 基础篇 NumPy的主要对象是同种元素的多维数组. 这是一个所有的元素都是一种类型.通过 ...
随机推荐
- 怎么做 HDFS 的原地平滑缩容?
背景 当数据规模越来越大,存储成本也水涨船高.随着时间推移,数据热度分布往往呈 2⁄8 原则,即 80% 的访问集中在 20% 的数据上.对于那不经常访问的 80% 数据来说,使用多个 SSD 来存储 ...
- cookie、session和Storage
概念: cookie:HTTP响应头的一部分,通过name=value的形式存储,主要用于保存登录信息.在设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭. 存放数据大小为4K左右 .有个 ...
- web自动化之selenium(二)
selenium自动化测试框架 一.什么是自动化测试 利用软件(或者说机器代替人)实现全部或者部分测试任务的过程 二.为什么要进行自动化测试 自动化测试可以完成许多手工测试无法实现或难以实现的功能 ...
- 机器学习之BP神经网络
import random import math #神经元的定义 class Neuron: def __init__(self,bias): self.bias = bias self.weigh ...
- Kafka的优秀设计学习
一.Kafka基础 消息系统的作用 应该大部份小伙伴都清楚,用机油装箱举个例子 所以消息系统就是如上图我们所说的仓库,能在中间过程作为缓存,并且实现解耦合的作用. 引入一个场景,我们知道中国移动,中国 ...
- django之分页,纯python代码
Django中分页 py文件代码 """ 自定义分页组件 可以返回分页的数据和分页的HTML代码 """ from django.http ...
- Django的缓存机制和信号
Django的缓存机制 1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户 ...
- HTTP 之 Content-Type
Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定文件接收方将以什么形式.什么编码读取这个文件,这就是经常看到一些Asp网页点击 ...
- Spark—GraphX编程指南
Spark系列面试题 Spark面试题(一) Spark面试题(二) Spark面试题(三) Spark面试题(四) Spark面试题(五)--数据倾斜调优 Spark面试题(六)--Spark资源调 ...
- Postman请求报错:Error:getaddrinfo ENOENT 50.88.88.88
一.问题来源 今天发布一个新开发的项目到通州现场,内容是开放几个接口给第三方调用,需要现场部署的同事使用postman调用测试一下,现场同事使用postman调用后反馈有如下错误: 二.解决方法 发现 ...