您的位置:

实现多维数组索引的NumPy.argwhere

一、numpy.argwhere简介

numpy.argwhere函数是一个广泛使用的函数,它用于查找索引,遍历多维数组,并返回非零元素的位置坐标。

argwhere函数返回一个数组的所有非零元素的索引值(按照索引值的顺序),并将其转换为元组的形式。元组的第一维是非零元素的行号,第二维是非零元素的列号,以此类推。

import numpy as np 

# 创建一个多维数组
arr = np.array([[0, 1, 0], 
                [1, 0, 1], 
                [0, 1, 0]]) 

# 使用numpy.argwhere函数查找非零元素的索引值
result = np.argwhere(arr) 

print(result)
输出结果如下:
array([[0, 1],
       [1, 0],
       [1, 2],
       [2, 1]])

输出结果表示这个多维数组中,有四个非零元素,它们的索引分别是(0,1),(1,0),(1,2)和(2,1)。

二、多维数组索引

在NumPy中,多维数组的索引需要指定多个维度上的索引值,我们可以使用numpy.argwhere函数来查找多维数组中指定元素的索引。

比如说,我们有一个多维数组,其中的数字表示一个8×8的棋盘,1代表棋子,0代表空格。我们现在要查找第一个棋子的坐标:

import numpy as np 

# 创建一个8×8的多维数组,其中的数字表示一个棋盘,1表示棋子,0表示空格
board = np.array([[0, 0, 0, 0, 0, 0, 0, 0], 
                 [0, 1, 0, 0, 0, 0, 0, 0], 
                 [0, 0, 0, 0, 0, 0, 0, 0], 
                 [0, 0, 0, 0, 0, 0, 0, 0], 
                 [0, 0, 0, 0, 0, 0, 0, 0], 
                 [0, 0, 0, 0, 0, 0, 0, 0], 
                 [0, 0, 0, 0, 0, 0, 0, 0], 
                 [0, 0, 0, 0, 0, 0, 0, 0]])

# 使用numpy.argwhere函数查找第一个棋子的索引
index = np.argwhere(board == 1)

print(index[0])
输出结果如下:
[1 1]

输出结果表示第一个棋子所在的位置是(1,1)。

三、多维数组切片

在NumPy中,我们可以使用切片(slice)操作来截取多维数组中的一部分。切片的方式与Python中的列表、字符串等数据类型的切片方式相似。

比如说,我们有一个二维数组,我们想要截取其中的一部分,可以使用numpy.argwhere函数来确定我们需要截取的部分的范围。

import numpy as np

# 创建一个随机的二维数组
arr = 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]])

# 使用numpy.argwhere函数查找我们需要切片的部分的范围
index = np.argwhere((arr > 5) & (arr < 18))

# 根据索引值进行切片操作
result = arr[index[0,0]:index[-1,0]+1, index[0,1]:index[-1,1]+1]

print(result)
输出结果如下:
[[ 6  7  8]
 [11 12 13]
 [16 17]]

输出结果表示,我们通过numpy.argwhere函数确定了需要截取部分的索引范围,然后使用这个索引范围对原本的多维数组进行了切片,得到了我们想要的部分。