Python 教程之 Numpy(6)—— 索引

简介: Python 教程之 Numpy(6)—— 索引

NumPy 或 Numeric Python 是一个用于计算同质 n 维数组的包。在 numpy 维度中称为轴。

为什么我们需要 NumPy ?

出现了一个问题,当 python 列表已经存在时,为什么我们需要 NumPy。答案是我们不能直接对两个列表的所有元素执行操作。例如,我们不能直接将两个列表相乘,我们必须逐个元素地进行。这就是 NumPy 发挥作用的地方。

示例 #1:

# 演示需要 NumPy 的 Python 程序
list1 = [1, 2, 3, 4 ,5, 6]
list2 = [10, 9, 8, 7, 6, 5]
# 将两个列表直接相乘会出错。
print(list1*list2)

输出 :

TypeError: can't multiply sequence by non-int of type 'list'

因为这可以通过 NumPy 数组轻松完成。

示例 #2:

# 演示 NumPy 数组使用的 Python 程序
import numpy as np
list1 = [1, 2, 3, 4, 5, 6]
list2 = [10, 9, 8, 7, 6, 5]
# 将 list1 转换为 NumPy 数组
a1 = np.array(list1)
# 将 list2 转换为 NumPy 数组
a2 = np.array(list2)
print(a1*a2)

输出 :

array([10, 18, 24, 28, 30, 30])

python的numpy包具有以不同方式索引的强大功能。

使用索引数组进行索引

索引可以通过使用数组作为索引在 numpy 中完成。在切片的情况下,返回数组的视图或浅表副本,但在索引数组中返回原始数组的副本。Numpy 数组可以用其他数组或任何其他序列索引,但元组除外。最后一个元素由 -1 索引,第二个由 -2 索引,依此类推。

示例 #1:

# 演示索引数组使用的 Python 程序。
import numpy as np
# 创建一个从 10 到 1 的整数序列,步长为 -2
a = np.arange(10, 1, -2) 
print("\n A sequential array with a negative step: \n",a)
# 索引在 np.array 方法中指定。
newarr = a[np.array([3, 1, 2 ])]
print("\n Elements at these indices are:\n",newarr)

输出 :

A sequential array with a negative step:
[10  8  6  4  2]
Elements at these indices are:
[4 8 6]

示例 #2:

import numpy as np
# 元素从 1 到 9 的 NumPy 数组
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
# 索引值可以是负数。
arr = x[np.array([1, 3, -3])]
print("\n Elements are : \n",arr)

输出 :

Elements are:
[2 4 7]

索引类型

有两种类型的索引:

基本切片和索引: 考虑语法 x[obj],其中 x 是数组,obj 是索引。切片对象是基本切片情况下的索引。当 obj 为 时发生基本切片:

  • 形式为 start : stop : step 的切片对象
  • 一个整数
  • 或切片对象和整数的元组

基本切片生成的所有数组始终是原始数组的视图

代码#1:

# 用于基本切片的 Python 程序。
import numpy as np
# 从 0 到 19 排列元素
a = np.arange(20)
print("\n Array is:\n ",a)
# a[start:stop:step]
print("\n a[-8:17:1]  = ",a[-8:17:1]) 
# : 运算符表示直到最后的所有元素。
print("\n a[10:]  = ",a[10:])

输出 :

Array is:
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
a[-8:17:1]  =  [12 13 14 15 16]
a[10:] = [10 11 12 13 14 15 16 17 18 19] 

代码#2:

# 用于基本切片和索引的 Python 程序
import numpy as np
# A 3-Dimensional array
a = np.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]]
print("\n Array is:\n ",a)
# 切片和索引
print("\n a[0, 3:5]  = ",a[0, 3:5]) 
print("\n a[4:, 4:]  = ",a[4:, 4:]) 
print("\n a[:, 2]  = ",a[:, 2]) 
print("\n a[2:;2, ::2]  = ",a[2:;2, ::2]) 

输出 :

Array is:
 [[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]]
a[0, 3:5]  =  [3 4]
a[4:, 4:] = [[28 29],
             [34 35]]
a[:, 2] =  [2 8 14 20 26 32]
a[2:;2, ::2] = [[12 14 16],
                [24 26 28]]

下图让概念更清晰:

image.png

省略号也可以与基本切片一起使用。省略号 (...) 是 : 对象的数量,需要创建一个长度与数组维度相同的选择元组。

# 使用带省略号的基本切片进行索引的 Python 程序
import numpy as np
# A 3 dimensional array.
b = np.array([[[1, 2, 3],[4, 5, 6]],
              [[7, 8, 9],[10, 11, 12]]])
print(b[...,1]) #Equivalent to b[: ,: ,1 ]

输出 :

[[ 2 5] 
 [ 8 11]]

高级索引: 当 obj 为 - 时触发高级索引

  • 整数或布尔类型的 ndarray
  • 或具有至少一个序列对象的元组
  • 是一个非元组序列对象

高级索引返回数据的副本而不是它的视图。高级索引有整数和布尔两种类型。

纯整数索引: 当整数用于索引时。第一维的每个元素都与第二维的元素配对。所以本例中元素的索引为 (0,0),(1,0),(2,1) 并选择相应的元素。

# 显示高级索引的 Python 程序
import numpy as np
a = np.array([[1 ,2 ],[3 ,4 ],[5 ,6 ]])
print(a[[0 ,1 ,2 ],[0 ,0 ,1]])

输出 :

[1 3 6]

结合高级索引和基本索引: 当索引中至少有一个切片 (:)、省略号 (...) 或 newaxis 时(或者数组的维度多于高级索引),则行为可能会更复杂。这就像连接每个高级索引元素的索引结果


在最简单的情况下,只有一个高级索引。例如,单个高级索引可以替换切片,结果数组将是相同的,但是,它是一个副本并且可能具有不同的内存布局。如果可能,切片是优选的。

# 显示高级和基本索引的 Python 程序
import numpy as np
a = np.array([[0 ,1 ,2],[3 ,4 ,5 ],
              [6 ,7 ,8],[9 ,10 ,11]])
print(a[1:2 ,1:3 ])
print(a[1:2 ,[1,2]])

输出 :

[4, 5] 
[4, 5]

了解情况的最简单方法可能是根据结果形状进行思考。索引操作有两个部分,由基本索引(不包括整数)定义的子空间和来自高级索引部分的子空间。需要区分两种索引组合的情况:

高级索引由切片、省略号或 newaxis 分隔。例如x[arr1, :, arr2].

高级索引都彼此相邻。例如x[..., arr1, arr2, :],但不是x[arr1, :, 1] 因为 1 在这方面是一个高级索引。

在第一种情况下,高级索引操作产生的维度首先出现在结果数组中,然后是子空间维度。在第二种情况下,来自高级索引操作的维度被插入到结果数组中与它们在初始数组中相同的位置(后一种逻辑使简单的高级索引的行为就像切片一样)。


布尔数组索引:

这个索引有一些布尔表达式作为索引。返回满足该布尔表达式的那些元素。它用于过滤所需的元素值。

代码 #1

# 您可能希望选择大于 50 的数字
import numpy as np
a = np.array([10, 40, 80, 50, 100])
print(a[a>50])

输出 :

[80 100]

代码 #2

# 您可能希望将 40 的倍数平方
import numpy as np
a = np.array([10, 40, 80, 50, 100])
print(a[a%40==0]**2)

输出 :

[1600 6400])

代码 #3

# 您可能希望选择行之和是 10 的倍数的那些元素。
import numpy as np
b = np.array([[5, 5],[4, 5],[16, 4]])
sumrow = b.sum(-1)
print(b[sumrow%10==0])

输出 :

array([[ 5, 5], [16, 4]])

感谢大家的阅读,有什么问题的话可以在评论中告诉我。希望大家能够给我来个点赞+收藏+评论 ,你的支持是海海更新的动力!后面我会持续分享前端 & 后端相关的专业知识。


目录
相关文章
|
6月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
563 1
|
6月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
670 0
|
6月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
356 0
|
7月前
|
数据采集 存储 XML
Python爬虫技术:从基础到实战的完整教程
最后强调: 父母法律法规限制下进行网络抓取活动; 不得侵犯他人版权隐私利益; 同时也要注意个人安全防止泄露敏感信息.
1001 19
|
6月前
|
索引 Python
Python 列表切片赋值教程:掌握 “移花接木” 式列表修改技巧
本文通过生动的“嫁接”比喻,讲解Python列表切片赋值操作。切片可修改原列表内容,实现头部、尾部或中间元素替换,支持不等长赋值,灵活实现列表结构更新。
317 1
|
7月前
|
数据采集 存储 JSON
使用Python获取1688商品详情的教程
本教程介绍如何使用Python爬取1688商品详情信息,涵盖环境配置、代码编写、数据处理及合法合规注意事项,助你快速掌握商品数据抓取与保存技巧。
|
8月前
|
存储 数据采集 数据处理
Pandas与NumPy:Python数据处理的双剑合璧
Pandas与NumPy是Python数据科学的核心工具。NumPy以高效的多维数组支持数值计算,适用于大规模矩阵运算;Pandas则提供灵活的DataFrame结构,擅长处理表格型数据与缺失值。二者在性能与功能上各具优势,协同构建现代数据分析的技术基石。
677 0
|
8月前
|
并行计算 算法 Java
Python3解释器深度解析与实战教程:从源码到性能优化的全路径探索
Python解释器不止CPython,还包括PyPy、MicroPython、GraalVM等,各具特色,适用于不同场景。本文深入解析Python解释器的工作原理、内存管理机制、GIL限制及其优化策略,并介绍性能调优工具链及未来发展方向,助力开发者提升Python应用性能。
508 0
|
8月前
|
机器学习/深度学习 API 异构计算
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
JAX是Google开发的高性能数值计算库,旨在解决NumPy在现代计算需求下的局限性。它不仅兼容NumPy的API,还引入了自动微分、GPU/TPU加速和即时编译(JIT)等关键功能,显著提升了计算效率。JAX适用于机器学习、科学模拟等需要大规模计算和梯度优化的场景,为Python在高性能计算领域开辟了新路径。
846 0
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
|
机器学习/深度学习 数据处理 Python
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
425 1

热门文章

最新文章

推荐镜像

更多