欢迎关注公众号【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的索引的更多相关文章

  1. 转:Numpy教程

    因为用到theano写函数的时候饱受数据结构困扰 于是上网找了一篇numpy教程(theano的数据类型是基于numpy的) 原文排版更好,阅读体验更佳: http://phddreamer.blog ...

  2. Python 机器学习库 NumPy 教程

    0 Numpy简单介绍 Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy.matplotlib一起使用.其实,list已经提供了类似于矩阵的表示形式,不过numpy ...

  3. numpy教程

    [转]CS231n课程笔记翻译:Python Numpy教程 原文链接:https://zhuanlan.zhihu.com/p/20878530 译者注:本文智能单元首发,翻译自斯坦福CS231n课 ...

  4. NumPy 教程目录

    NumPy 教程目录 1 Lesson1--NumPy NumPy 安装 2 Lesson2--NumPy Ndarray 对象 3 Lesson3--NumPy 数据类型 4 Lesson4--Nu ...

  5. Mysql实战45讲 04讲深入浅出索引(上)读书笔记 极客时间

    极客时间 Mysql实战45讲 04讲深入浅出索引 极客时间(上)读书笔记  笔记体悟 1.索引的作用:提高数据查询效率2.常见索引模型:哈希表.有序数组.搜索树3.哈希表:键 - 值(key - v ...

  6. [译]Vulkan教程(04)基础代码

    [译]Vulkan教程(04)基础代码 General structure 通用结构 In the previous chapter you've created a Vulkan project w ...

  7. 【GStreamer开发】GStreamer播放教程04——既看式流

    目的 在<GStreamer基础教程--流>里面我们展示了如何在较差的网络条件下使用缓冲这个机制来提升用户体验.本教程在<GStreamer基础教程--流>的基础上在扩展了一下 ...

  8. Elasticsearch入门教程(三):Elasticsearch索引&映射

    原文:Elasticsearch入门教程(三):Elasticsearch索引&映射 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文 ...

  9. 【转】numpy教程

    [转载说明] 本来没有必要转载的,只是网上的版本排版不是太好,看的不舒服.所以转过来,重新排版,便于自己查看. 基础篇 NumPy的主要对象是同种元素的多维数组. 这是一个所有的元素都是一种类型.通过 ...

随机推荐

  1. 【漏洞复现】Paraluni 安全事件分析及复现

    Paraluni 被黑分析 前言 Paraluni (平行宇宙)是新加坡 Parallel Universe 基金会发布的一个 基于币安智能链的 DeFi 项目,更多相关内容见此处.在 2022 年 ...

  2. (acwing蓝桥杯c++AB组)1.2 递推

    1.2 递推与递归 文章目录 1.2 递推与递归 位运算相关知识补充 pair与vector相关知识补充 题目目录与网址链接 下面的讲解主要针对这道题目的题解AcWing 116. 飞行员兄弟 - A ...

  3. ## [湖南省赛2019]Findme ###

    [湖南省赛2019]Findme 1.题目概述 2.解题过程 010打开这几张图片 先简单分析一下这几张图片 简单分析 1.png 从外观上,1.png明显高度太低,需要更改 2.png 2.png末 ...

  4. 使用Github Action自动填写疫情通

    使用Github Action自动填写疫情通 西电晨午晚检一天三次,通过企业号功能进行填写.实际上,西电企业号大部分功能是以网页模式工作的,通过构造connection发送合适的request,设置计 ...

  5. 远程控制Windows2003下安装Pcanywhere导致Awgina.dll出错的解决办法

    远程控制的时候出现的问题引用 症状启动计算机时,"欢迎使用 Windows"登录屏幕不出现.您还可能会看到与下面的某条信息类似的错误信息: ? 一个最近安装的程序使欢迎屏幕和快速用 ...

  6. 记mysql5.7错误only_full_group_by

    错误截图为上 mysql版本:5.7.35-0ubuntu0.18.04.1 "this is incompatible with sql_mode=only_full_group_by&q ...

  7. 你应该知道的Redis事务

    前两篇 Redis 文章都大几千字,今天我们换个小清新点的 如果你也了解过关系型数据库事务的话,相信这篇文章对你来说是很容易理解的了.具体什么是事务我就不说不多了,直接讲 Redis 事务相关的部分. ...

  8. C#中的类型转换-自定义隐式转换和显式转换

    目录 前言 基础知识 示例代码 实际应用 问题 答案 报错 用户定义的转换必须是转换成封闭类型,或者从封闭类型转换 参考 其他 应用和设计 读音 参考 前言 有时我们会遇到这么一种情况:在json数据 ...

  9. 什么是 Java Timer 类?如何创建一个有特定时间间隔的任务?

    java.util.Timer 是一个工具类,可以用于安排一个线程在未来的某个特定时间执 行.Timer 类可以用安排一次性任务或者周期任务. java.util.TimerTask 是一个实现了 R ...

  10. Java 中,编写多线程程序的时候你会遵循哪些最佳实践?

    这是我在写 Java 并发程序的时候遵循的一些最佳实践: a)给线程命名,这样可以帮助调试. b)最小化同步的范围,而不是将整个方法同步,只对关键部分做同步. c)如果可以,更偏向于使用 volati ...