Python NumPy教程之索引详解

目录
  • 为什么我们需要 NumPy
  • 使用索引数组进行索引
  • 索引类型
    • 基本切片和索引
    • 高级索引

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]]

下图让概念更清晰:

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

# 使用带省略号的基本切片进行索引的 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]])

到此这篇关于Python NumPy教程之索引详解的文章就介绍到这了,更多相关Python Numpy索引内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python numpy数组的索引和切片的操作方法

    NumPy - 简介 NumPy 是一个 Python 包. 它代表 "Numeric Python". 它是一个由多维数组对象和用于处理数组的例程集合组成的库. Numeric,即 NumPy 的前身,是由 Jim Hugunin 开发的. 也开发了另一个包 Numarray ,它拥有一些额外的功能. 2005年,Travis Oliphant 通过将 Numarray 的功能集成到 Numeric 包中来创建 NumPy 包. 这个开源项目有很多贡献者. NumPy 操作 使用Nu

  • python中找出numpy array数组的最值及其索引方法

    在list列表中,max(list)可以得到list的最大值,list.index(max(list))可以得到最大值对应的索引 但在numpy中的array没有index方法,取而代之的是where,其又是list没有的 首先我们可以得到array在全局和每行每列的最大值(最小值同理) >>> a = np.arange(9).reshape((3,3)) >>> a array([[0, 1, 2], [9, 4, 5], [6, 7, 8]]) >>&

  • Python Numpy学习之索引及切片的使用方法

    目录 1. 索引及切片 2. 高级索引 1. 索引及切片 数组中的元素可以通过索引以及切片的手段进行访问或者修改,和列表的切片操作一样. 下面直接使用代码进行实现,具体操作方式以及意义以代码注释为准: (1)通过下标以及内置函数进行索引切片 """ Author:XiaoMa date:2021/12/30 """ import numpy as np a = np.arange(10)#创建一个从0-9的一维数组 print(a) i = sl

  • Python中的 Numpy 数组形状改变及索引切片

    目录 1.改变数组形状 2.索引和切片 1.改变数组形状 数组的shape属性返回一个元组,包括维度以及每个轴的元素数量,Numpy 还提供了一个reshape()方法,它可以改变数组的形状,返回一个新的数组. 例如: a = np.array([1,2,3,4,5,6,7,8]) 转换成二维数组: b = a.reshape((2,4)) 转换成三维数组: c = a.reshape((2,2,2)) 但是需要注意的是,修改后的数组元素个数与原数组元素个数必须是一致的,不一致会报错. 例如执行

  • Python NumPy教程之索引详解

    目录 为什么我们需要 NumPy 使用索引数组进行索引 索引类型 基本切片和索引 高级索引 NumPy 或 Numeric Python 是一个用于计算同质 n 维数组的包.在 numpy 维度中称为轴. 为什么我们需要 NumPy 出现了一个问题,当 python 列表已经存在时,为什么我们需要 NumPy.答案是我们不能直接对两个列表的所有元素执行操作.例如,我们不能直接将两个列表相乘,我们必须逐个元素地进行.这就是 NumPy 发挥作用的地方. 示例 #1: # 演示需要 NumPy 的

  • Python 变量教程私有变量详解

    目录 前言 重整及其工作原理 _单前导下划线 __双前导下划线 双前导和双尾下划线 前言 Python 中,不存在只能在对象内部访问的“私有”实例变量.然而,大多数 Python 代码和编码器都遵循一个约定,即以下划线为前缀的名称,例如 _geek应被视为 API 或任何 Python 代码的非公共部分,无论它是函数还是方法,或数据成员.在经历这个过程时,我们还将尝试理解各种形式的尾随下划线的概念,例如,for _ in range(10), init(self). 重整及其工作原理 在 Pyt

  • Python运算符教程之逻辑门详解

    目录 1. 与门 2. 与非门 3. 或门 4. 异或 5. NOT Gate 6. NOR 门 7. XNOR 门 逻辑门是任何数字电路的基本构建块.它需要一两个输入并根据这些输入产生输出.输出可能为高 (1) 或低 (0).逻辑门使用二极管或晶体管实现.它也可以使用真空管.光学元件.分子等电磁元件构成.在计算机中,大多数电子电路都是由逻辑门组成的.逻辑门用于执行计算.数据存储或展示面向对象编程(尤其是继承的力量)的电路. 定义了七个基本逻辑门:与门.或门.非门.与非门.或非门.异或门.异或门

  • Python基础教程之控制结构详解

    目录 0. 学习目标 1. 代码块与缩进 2. 条件语句 2.1 if 语句 2.2 if 语句的嵌套 2.3 断言 3. 循环 3.1 while 循环 3.2 for 循环 3.3 中断循环 4. 控制语句综合嵌套 5. 列表解析式 注意: 总结 0. 学习目标 Python 是简洁.易学.面向对象的编程语言.它不仅拥有强大的原生数据类型,也提供了简单易用的控制语句.在<Python基础教程>的系列博文中,我们已经介绍了 Python 中的内置原生数据类型,并且也了解了程序如何利用输入.输

  • Python基础教程之异常处理详解

    目录 前言 异常 错误与异常 语法错误 异常 异常处理 自主抛出异常 自定义异常 finally子句 总结 前言 最近发现有些东西长时间不用就要忘了,坚持每天复习总结一个小知识点吧~ 异常是什么呢?就是在代码执行过程中非预期的执行结果,随着代码越来越复杂,代码中的执行逻辑也会越来越复杂,如果没有处理好异常情况,很有可能造成软件执行错误,导致重大损失.相反,如果合理的处理异常情况,则可以增强软件的稳定性,提高体验感. 异常 在Python中,使用异常对象(exception object)来表示代

  • Python基础教程之异常详解

    一.摘要 Python使用被称为异常 的特殊对象来管理程序执行期间发生的错误.每当发生让Python不知所措的错误时,它都会创建一个异常对象.如果你编写了处理该异常的代码,程序将继续运行:如果你未对异常进行处理,程序将停止,并显示一个traceback,其中包含有关异常的报告. 异常是使用try-except 代码块处理的.try-except 代码块让Python执行指定的操作,同时告诉Python发生异常时怎么办.使用了try-except 代码块时,即便出现异常,程序也将继续运行:显示你编

  • python基础教程之序列详解

    sequence 序列 sequence(序列)是一组有顺序的元素的集合 (严格的说,是对象的集合,但鉴于我们还没有引入"对象"概念,暂时说元素) 序列可以包含一个或多个元素,也可以没有任何元素. 我们之前所说的基本数据类型,都可以作为序列的元素.元素还可以是另一个序列,以及我们以后要介绍的其他对象. 序列有两种:tuple(定值表: 也有翻译为元组) 和 list (表) 复制代码 代码如下: >>>s1 = (2, 1.3, 'love', 5.6, 9, 12,

  • Python NumPy教程之数组的基本操作详解

    目录 Numpy中的N维数组(ndarray) 数组创建 数组索引 基本操作 数据类型 Numpy中的N维数组(ndarray) Numpy 中的数组是一个元素表(通常是数字),所有元素类型相同,由正整数元组索引.在 Numpy 中,数组的维数称为数组的秩.给出数组沿每个维的大小的整数元组称为数组的形状.Numpy 中的数组类称为ndarray.Numpy 数组中的元素可以使用方括号访问,并且可以使用嵌套的 Python 列表进行初始化. 例子 : [[ 1, 2, 3], [ 4, 2, 5]

  • Python NumPy教程之遍历数组详解

    NumPy 包包含一个迭代器对象numpy.nditer.它是一个高效的多维迭代器对象,使用它可以迭代数组.使用 Python 的标准迭代器接口访问数组的每个元素. # 用于遍历数组的 Python 程序 import numpy as geek # 使用排列方法创建数组 a = geek.arange(12) # 具有 3 行和 4 列的形状数组 a = a.reshape(3,4) print('Original array is:') print(a) print() print('Mod

  • Python Numpy教程之排序,搜索和计数详解

    目录 排序 搜索 Counting 排序 排序是指以特定格式排列数据.排序算法指定以特定顺序排列数据的方式.最常见的顺序是数字或字典顺序.在 Numpy 中,我们可以使用库中提供的各种函数(如 sort.lexsort.argsort 等)执行各种排序操作. numpy.sort(): 此函数返回数组的排序副本. # 导入库 import numpy as np # 沿第一轴排序 a = np.array([[12, 15], [10, 1]]) arr1 = np.sort(a, axis =

随机推荐