📜  Python中NumPy的基本切片Slicing和高级索引Indexing

📅  最后修改于: 2020-04-18 14:16:18             🧑  作者: Mango

先决条件:Python中的Numpy简介
Numpy或Numeric Python是用于在均匀n维数组上进行计算的软件包。在Numpy中,尺寸称为轴。

为什么我们需要NumPy?

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

# 演示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数组可以轻松完成此操作。
另一个例子,

# Python程序演示NumPy数组的使用
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])

本文将帮助您熟悉Numpy中的索引。Python的Numpy软件包具有以不同方式进行索引的强大功能。

使用索引数组建立索引

Numpy数组可以与其他数组或任何其他序列(元组除外)建立索引。最后一个元素的索引为-1,倒数第二索引为-2,依此类推。

# Python程序演示索引数组的使用.
import numpy as np
#创建一个从10到1的整数序列,步长为-2
a = np.arange(10, 1, -2)
print("\n 具有负步长的顺序数组: \n",a)
# 索引在np.array方法中指定.
newarr = a[np.array([3, 1, 2 ])]
print("\n 这些索引处的元素是:\n",newarr)

输出:

具有负步长的顺序数组:
[10  8  6  4  2]
这些索引处的元素是:
[4 8 6]

另一个例子:

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

输出:

元素是:
[2 4 7]

索引类型

索引有两种类型:

  1. 基本切片和索引:考虑语法x [obj],其中x是数组,而obj是索引:
    1. 一个切片对象,其形式为start:stop:step
    2. 一个整数
    3. 切片对象和整数的元组

    通过基本切片生成的所有数组始终都是原始数组的子数组。

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

    输出:

    数组为:
    [ 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]

    省略号也可以与基本切片一起使用。省略号(…):选择元组的长度与数组的尺寸相同的对象。

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

    输出:

    [[2 5]
     [8 11]]

    2, 高级索引,在obj为如下条件下

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

    高级索引返回数据的副本,而不是其视图。高级索引具有整数和布尔两种类型。
    纯整数索引:当整数用于索引时。第一维的每个元素与第二维的元素配对。因此,在这种情况下元素的索引为(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]

    布尔索引
    该索引具有一些布尔表达式作为索引。返回满足该布尔表达式的那些元素,您可能希望选择大于50的数字它用于过滤所需的元素值。

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

    输出:

    [80 100]

     

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

    输出:

    [1600 6400])

     

    # 您可能希望选择行数总和为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]])