numpy的Fancy Indexing和array比较详解

  • Post category:Python

1. Fancy Indexing

Fancy Indexing是一种高级索引技术,它允许我们使用一个数组作为索引来获取另一个数组的元素。Fancy Indexing可以用于获取数组的任意子集,也可以用于修改数组的元素。

1.1 获取子集

我们可以使用Fancy Indexing来获取数组的任意子集。例如,我们可以使用一个布尔数组作为索引来获取数组中所有满足条件的元素。

import numpy as np

# 创建一个数组
arr = np.array([1, 2, 3, 4, 5])

# 创建一个布尔数组
mask = np.array([True, False, True, False,])

# 使用布尔数组作为索引获取子集
subset = arr[mask]

print(subset)  # [1 3 5]

我们也可以使用一个整数数组作为索引来获取数组的任意子集。例如,我们可以使用一个整数数组来获取数组中的第1、3和5个元素。

import numpy as np

# 创建一个数组
arr = np.array([1, 2, 3, 4, 5])

# 创建一个整数数组
indices = np.array([0, 2, 4])

# 使用整数数组作为索引获取子集
subset = arr[indicesprint(subset)  # [1 3 5]

1.2 修改元素

我们也可以使用Fancy Indexing来修改数组的元素。例如,我们可以使用一个布尔数组作为索引来将数组中所有满足条件的元素设置为0。

import numpy as np

# 创建一个数组
arr = np.array([1, 2, 3, 4, 5])

# 创建一个布尔数组
mask = np.array([True, False, True, False, True])

# 使用布尔数组作为索引修改元素
arr[mask] = 0

print(arr)  # [02 0 4 0]

我们也可以使用一个整数数组作为索引来修改数组的任意元素。例如,我们可以使用一个整数数组来将数组中的第1、3和5个元素设置为0。

import numpy as np

# 创建一个数组
arr = np.array([1, 2, 3, 4, 5# 创建一个整数数组
indices = np.array([0, 2, 4])

# 使用整数数组作为索引修改元素
arr[indices] = 0

print(arr)  # [0 2 0 4 0]

2. Array比较

在numpy中,我们可以使用比较运算符来比较两个数组的元素。比较算符返回一个布尔数组,其中每个元素表示两个数组对应位置的元素是否满足比较条件。

2.1 比较运算符

numpy支持以下比较运算符:

  • ==:等于
  • !=:不等于
  • <:于
  • >:大于
  • <=:小于等于
  • >=:大于等于

例如,我们可以比较两个数组的元素是否相等。

import numpy as np

# 创建两个数组
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([1, 2, 0, 4, 0])

# 比较两个数组的元素是否相等
mask = arr1 == arr2

print(mask)  # [ True  True False  True False]

2.2 逻辑运算符

我们也可以使用逻辑运算符来组合多个比较条件。numpy支持以下逻辑运算符:

  • &:逻辑与
    -|`:逻辑或
  • ~:逻辑非

例如,我们可以比较两个数组的元素是否同时满足两个条件。

import numpy as np

# 创建两个数组
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([1, 2, 0, 4, ])

# 比较两个数组的元素是否同时满足两个条件
mask = (arr1 > 2) & (arr2 == 0)

print(mask)  # [False False False False  True]

2.3 where函数

numpy还提供了一个where函数,它可以根据一个布尔数组来选择两个数组中的元。where函数返回一个新的数组,其中每个元素根据布尔数组的值来选择。

import numpy as np

# 创建两个数组
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([10, 20, 30, 40, 50])

# 创建一个布尔数组
mask = np.array([True, False, True, False, True])

# 使用where函数选择两个数组中的元素
result = np.where(mask, arr1, arr2)

print(result)  # [ 1 20  3 40  5]

示例

下面是两个示例,第一个示例展示了如何使用Fancy Indexing获取数组的子集,第二个示例展示了如何使用比较运算符和where函数来选择数组中的元素。

示例1:获取子集

import numpy as np

# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 使用Fancy Indexing获取子集
subset = arr[[0, 2], [1, 2]]

print(subset)  # [2 9]

示例2:选择元素

import numpy as np

# 创建两数组
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([10, 20, 30, 40, 50])

# 比较两个数组的元素是否大于3
mask = arr1 > 3

# 使用where函数选择两个数组中的元素
result = np.where(mask, arr1, arr2)

print(result)  # [10 20 30  4  5]