张量(Tensor)、标量(scalar)、向量(vector)、矩阵(matrix)

Python Numpy 切片和索引(高级索引、布尔索引、花式索引)

Python NumPy 广播(Broadcast)

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:

  • 一个强大的N维数组对象 ndarray
  • 广播功能函数
  • 整合 C/C++/Fortran 代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能

NumPy 应用

NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用, 这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。

SciPy 是一个开源的 Python 算法库和数学工具包。

SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。

Matplotlib 是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面。它为利用通用的图形用户界面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 向应用程序嵌入式绘图提供了应用程序接口(API)。

切片和索引

arr[x][y] = arr[x,y] 两种表达方式

import numpy as np

arr = np.arange(21)  # arange() 函数创建 ndarray 对象
# arr = arr.reshape(3, 7)
arr.shape = (3, 7)
'''
[[ 0 1 2 3 4 5 6]
[ 7 8 9 10 11 12 13]
[14 15 16 17 18 19 20]]
'''
print(arr)
print('\n')
'''
arr[x][y] = arr[x,y] 两种表达方式
冒号 : 的解释:如果只放置一个参数,
如 [2],将返回与该索引相对应的单个元素。
如 [2:],表示从该索引开始以后的所有项都将被提取。如果使用了两个参数,
如 [2:7],那么则提取两个索引(不包括停止索引)之间的项。
'''
print('arr[1:2] =>', arr[1:2]) # 【1~2] 行,右侧不包含,列全部显示 => [[ 7 8 9 10 11 12 13]]
print('arr[1:] =>', arr[1:]) # 1 行开始,剩下的全部显示,列全部显示 => [[ 7 8 9 10 11 12 13] [14 15 16 17 18 19 20]]
print('arr[:2] =>', arr[:2]) # 取前面两行数据 [[ 0 1 2 3 4 5 6] [ 7 8 9 10 11 12 13]]
print('arr[2][1:6:2] =>', arr[2][1:6:2]) # start:stop:step => 第2行,1~6列,步长2(默认为1) [15 17 19]
print('arr[2, 1:6:2] =>', arr[2, 1:6:2]) # start:stop:step => 第2行,1~6列,步长2(默认为1) [15 17 19]
print('arr[:2, 1:6:2] =>', arr[:2, 1:6:2]) # start:stop:step => 前2行,1~6列,步长2(默认为1) [[ 1 3 5] [ 8 10 12]]
print('\n')
'''
切片还可以包括省略号 … ,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray。
'''
print('arr[1] => ', arr[1]) # 1行,所有列数据 [ 7 8 9 10 11 12 13]
print('arr[1, ...] => ', arr[1, ...]) # 1行,所有列数据 [ 7 8 9 10 11 12 13]
print('arr[..., 3] => ', arr[..., 3]) # 所有行,第3列数据 [ 3 10 17]
print('arr[1] => ', arr[..., 2:]) # 所有行 第3列及剩下的所有元素
print('\n')

高级索引

NumPy 中的高级索引指的是使用整数数组、布尔数组或者其他序列来访问数组的元素。相比于基本索引,高级索引可以访问到数组中的任意元素,并且可以用来对数组进行复杂的操作和修改。

import numpy as np

arr = np.arange(21)  # arange() 函数创建 ndarray 对象
# arr = arr.reshape(3, 7)
arr.shape = (3, 7)
'''
[[ 0 1 2 3 4 5 6]
[ 7 8 9 10 11 12 13]
[14 15 16 17 18 19 20]]
'''
print(arr)
print('\n')
'''
高级索引
'''
# 整数数组索引是指使用一个数组来访问另一个数组的元素。这个数组中的每个元素都是目标数组中某个维度上的索引值。
print('arr[[0, 1, 2], [2, 1, 3]] => ', arr[[0, 1, 2], [2, 1, 3]]) # [0,2]、【1,1】、[2,3] => [ 2 8 17]
rows = np.array([[0, 1], [2, 1], [1, 0]])
cols = np.array([[2, 1], [3, 2], [0, 2]])
'''
0,2 1,1
2,3 1,2
1,0 0,2
'''
print('arr[rows, cols] => ', arr[rows, cols]) # [[ 2 8] [17 9] [7 2]]
print('\n')
'''
可以借助切片 : 或 … 与索引数组组合。
'''
print('arr[1:3, 1:4] => ', arr[1:3, 1:4]) # [[ 8 9 10] [15 16 17]]
print('arr[1:3, [1, 4]] => ', arr[1:3, [1, 4]]) # [[ 8 11] [15 18]]
'''
[[ 0 1 2 3 4 5 6]
[ 7 8 9 10 11 12 13]
[14 15 16 17 18 19 20]]
'''
print('arr[..., 1:] => ', arr[..., 1:]) # [[ 1 2 3 4 5 6] [ 8 9 10 11 12 13] [15 16 17 18 19 20]]

布尔索引

我们可以通过一个布尔数组来索引目标数组。

布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。

import numpy as np

arr = np.arange(21)  # arange() 函数创建 ndarray 对象
# arr = arr.reshape(3, 7)
arr.shape = (3, 7)
'''
[[ 0 1 2 3 4 5 6]
[ 7 8 9 10 11 12 13]
[14 15 16 17 18 19 20]]
'''
print(arr)
print('\n') '''
获取大于 5 的元素
'''
print('arr[arr > 5]', arr[arr > 5]) # [ 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20] '''
~(取补运算符)来过滤NaN。
'''
arr = np.array([np.nan, 1, 2, np.nan, 3, 4, 5])
print('arr[~np.isnan(a)]', arr[~np.isnan(arr)]) # [1. 2. 3. 4. 5.]
'''
从数组中过滤掉非复数元素。
'''
arr = np.array([1, 2 + 6j, 5, 3.5 + 5j])
print('arr[np.iscomplex(arr)]', arr[np.iscomplex(arr)]) # [2. +6.j 3.5+5.j]

花式索引

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

花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。

对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素,如果目标是二维数组,那么就是对应下标的行。

花式索引跟切片不一样,它总是将数据复制到新数组中。

一维数组

一维数组只有一个轴 axis = 0,所以一维数组就在 axis = 0 这个轴上取值:

import numpy as np

x = np.arange(9) # [0 1 2 3 4 5 6 7 8]
print(x)
# 一维数组读取指定下标对应的元素
print("-------读取下标对应的元素-------")
x2 = x[[0, 6]] # 使用花式索引
print(x2) # [0 6] print(x2[0]) # 0
print(x2[1]) # 6

二维数组

import numpy as np

arr = np.arange(21)  # arange() 函数创建 ndarray 对象
# arr = arr.reshape(3, 7)
arr.shape = (3, 7)
'''
[[ 0 1 2 3 4 5 6]
[ 7 8 9 10 11 12 13]
[14 15 16 17 18 19 20]]
'''
print(arr)
print('\n') print('arr[1, [0, 2]] => ', arr[1, [0, 2]]) # [7 9]
print('arr[[0, 2], 1] => ', arr[[0, 2], 1]) # [ 1 15]
print('arr[[0, 2]] => ', arr[[0, 2]]) # [[ 0 1 2 3 4 5 6] [14 15 16 17 18 19 20]]
# 传入顺序索引数组
print('arr[[2,0,1]] => ', arr[[2, 0, 1]]) # [[14 15 16 17 18 19 20] [ 0 1 2 3 4 5 6] [ 7 8 9 10 11 12 13]] # 传入倒序索引数组
print('arr[[-2,-0,-1]] => ', arr[[-2, -0, -1]]) # [[ 7 8 9 10 11 12 13] [ 0 1 2 3 4 5 6] [14 15 16 17 18 19 20]]
# 传入多个索引数组(要使用 np.ix_)
'''
np.ix_ 函数就是输入两个数组,产生笛卡尔积的映射关系。
笛卡尔乘积是指在数学中,两个集合 X 和 Y 的笛卡尔积(Cartesian product),又称直积,表示为 X×Y,第一个对象是X的成员而第二个对象是 Y 的所有可能有序对的其中一个成员。
例如 A={a,b}, B={0,1,2},则:
A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}
B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)} [1, 0, 2, 1], [0, 3, 1, 2] => (1,0),(1,3),(1,1),(1,2),(0,0),(0,3),(0,1),(0,2)....
'''
print('arr[np.ix_([1,5,7,2],[0,3,1,2])] => ', arr[np.ix_([1, 0, 2, 1], [0, 3, 1, 2])]) # [[ 7 10 8 9] [ 0 3 1 2] [14 17 15 16] [7 10 8 9]]

相关链接

NumPy 官网 http://www.numpy.org/

NumPy 源代码:https://github.com/numpy/numpy

SciPy 官网:https://www.scipy.org/

SciPy 源代码:https://github.com/scipy/scipy

Matplotlib 教程:Matplotlib 教程

Matplotlib 官网:https://matplotlib.org/

Matplotlib 源代码:https://github.com/matplotlib/matplotlib

Python Numpy 切片和索引(高级索引、布尔索引、花式索引)的更多相关文章

  1. NumPy切片和索引

    NumPy - 切片和索引 ndarray对象的内容可以通过索引或切片来访问和修改,就像 Python 的内置容器对象一样. 如前所述,ndarray对象中的元素遵循基于零的索引. 有三种可用的索引方 ...

  2. NumPy 切片和索引

    NumPy 切片和索引 ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样. ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以 ...

  3. Python 的切片为什么不会索引越界?

    切片(slice)是 Python 中一种很有特色的特性,在正式开始之前,我们先来复习一下关于切片的知识吧. 切片主要用于序列对象中,按照索引区间截取出一段索引的内容. 切片的书写形式:[i : i+ ...

  4. Python进阶:全面解读高级特性之切片!

    导读:切片系列文章连续写了三篇,本文是对它们做的汇总.为什么要把序列文章合并呢?在此说明一下,本文绝不是简单地将它们做了合并,主要是修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔 ...

  5. 在python&numpy中切片(slice)

     在python&numpy中切片(slice) 上文说到了,词频的统计在数据挖掘中使用的频率很高,而切片的操作同样是如此.在从文本文件或数据库中读取数据后,需要对数据进行预处理的操作.此时就 ...

  6. Python学习札记(十五) 高级特性1 切片

    参考: 高级特性 切片 Note 1.掌握了Python的基础语法之后,就可以写出很多很有用的程序了,比如打印1-90的奇数: #!/usr/bin/env python3 L = [] n = 1 ...

  7. MySQL高级知识(七)——索引面试题分析

    前言:该篇随笔通过一些案例,对索引相关的面试题进行分析. 0.准备 #1.创建test表(测试表). drop table if exists test; create table test( id ...

  8. MySQL高级知识(六)——索引优化

    前言:索引优化的目的主要是让索引不失效,本篇通过相关案例对索引优化进行讲解. 0.准备 创建经典的tb_emp表. DROP TABLE IF EXISTS `tb_emp`; CREATE TABL ...

  9. MySQL高级知识(五)——索引分析

    前言:前面已经学习了explain(执行计划)的相关知识,这里利用explain对索引进行优化分析. 0.准备 首先创建三张表:tb_emp(职工表).tb_dept(部门表)和tb_desc(描述表 ...

  10. MySQL高级知识(三)——索引

    前言:索引在sql调优部分占据着重要的位置,了解并深入索引对我们来说也是非常重要的.本篇主要介绍MySQL中索引的相关知识点. 1.索引是什么 MySQL官方对索引的定义:索引(Index)是帮助My ...

随机推荐

  1. 统一返回对象Result

    统一返回对象Result 项目中我们会将响应封装成json返回,一般我们会将所有接口的数据格式统一, 使前端(iOS Android, Web)对数据的操作更一致.轻松. 一般情况下,统一返回数据格式 ...

  2. day02-容器功能

    容器功能 1.Spring注入组件的注解 Spring中的传统注解@Component.@Controller.@Service.@Repository,在SpringBoot中仍然有效. 2.@Co ...

  3. 多路复用IO:select poll epoll

    [电话面试]io多路复用专题面试 这个真猛 有人做了笔记:点这里 select Select(Max+1,&rset,null,null,null)是因为0~max是max+1. 过程: 将文 ...

  4. 声网王浩宇:RTE 场景下的 Serverless 架构挑战【RTE 2022】

    前言 在「RTE2022 实时互联网大会」中,声网云原生边缘计算团队的负责人 @王浩宇 Dylan 以<RTE 场景下的 Serverless 架构挑战 -- 声网如何兼顾后端服务的可靠.高效和 ...

  5. java多线程--5 同步方法和同步块synchronized

    java多线程--5 同步方法和同步块synchronized 同步方法和同步块 同步方法:关键字synchronized,包括synchronized方法和synchronized块 public ...

  6. Java 泛型与通配符 定义与使用

    一.泛型 定义: 把类型明确的工作推迟到创建对象或调用方法时才明确的类型,简而言之,未明确的数据类型. 类型: 泛型类,泛型方法,方形接口. 格式 泛型类格式:class 类名<E变量>{ ...

  7. 浅谈Vue 2.x当中组件之间传值方式

    一.父子之间传值 1. 父传子 :props <!DOCTYPE html> <html lang="en"> <head> <meta ...

  8. 官方文档 | 【JVM调优体系】「GC底层调优实战」XPocket为终结性能问题而生—开发指南

    XPocket 用户文档 XPocket 是PerfMa为终结性能问题而生的开源的插件容器,它是性能领域的乐高,将定位或者解决各种性能问题的常见的Linux命令,JDK工具,知名性能工具等适配成各种X ...

  9. 【开源项目】合肥~超经典智慧城市CIM/BIM数字孪生可视化项目—开源工程及源码

    最新消息,数字孪生智慧宁波开源了其数据工程源码和工程,免费送出供大家学习.使用.分享. ​ 智慧宁波实现了一系列全面的功能,如实现长三角经济圈特效.智慧地铁特效.智慧灯杆特性等.这些项目利用数字孪生技 ...

  10. Android Banner - ViewPager 02

    Android Banner - ViewPager 02 现在来给viewpager实现的banenr加上自动轮播 自动轮播的原理,使用handler的延迟消息来实现. 自动轮播实现如下内容 开始轮 ...