python 根据索引提区数组中的多个元素 numpy根据索引取值_二维数组


@R星校长

5关:索引与切片

索引

ndarray的索引其实和pythonlist的索引极为相似。元素的索引从0开始。代码如下:

import numpy as np

# a中有4个元素,那么这些元素的索引分别为0,1,2,3
a = np.array([2, 15, 3, 7])
# 打印第2个元素
# 索引1表示的是a中的第2个元素
# 结果为15
print(a[1])
# b是个2行3列的二维数组
b = np.array([[1, 2, 3], [4, 5, 6]])
# 打印b中的第1行
# 总共就2行,所以行的索引分别为0,1
# 结果为[1, 2, 3]
print(b[0])
# 打印b中的第2行第2列的元素
# 结果为5
print(b[1][1])

遍历

ndarray的遍历方式与pythonlist的遍历方式也极为相似,示例代码如下:

import numpy as np
a = np.array([2, 15, 3, 7])
# 使用for循环将a中的元素取出来后打印
for element in a:
    print(element)
# 根据索引遍历a中的元素并打印
for idx in range(len(a)):
    print(a[idx])
# b是个2行3列的二维数组
b = np.array([[1, 2, 3], [4, 5, 6]])
# 将b展成一维数组后遍历并打印
for element in b.flat:
    print(element)
# 根据索引遍历b中的元素并打印
for i in range(len(b)):
    for j in range(len(b[0])):
        print(b[i][j])

切片

ndarray的切片方式与pythonlist的遍历方式也极为相似,对切片不熟的同学也不用慌,套路很简单,就是用索引。

假设想要将下图中紫色部分切片出来,就需要确定行的范围和列的范围。由于紫色部分行的范围是02,所以切片时行的索引范围是0:3(索引范围是左闭右开);又由于紫色部分列的范围也是02,所以切片时列的索引范围也是0:3(索引范围是左闭右开)。最后把行和列的索引范围整合起来就是[0:3, 0:3](,左边是行的索引范围)。当然有时为了方便,0可以省略,也就是[:3, :3]

python 根据索引提区数组中的多个元素 numpy根据索引取值_python_02

切片示例代码如下:

import numpy as np
# a中有4个元素,那么这些元素的索引分别为0,1,2,3
a = np.array([2, 15, 3, 7])
'''
将索引从1开始到最后的所有元素切片出来并打印
结果为[15  3  7]
'''
print(a[1:])
'''
将从倒数第2个开始到最后的所有元素切片出来并打印
结果为[3  7]
'''
print(a[-2:])
'''
将所有元素倒序切片并打印
结果为[ 7  3 15  2]
'''
print(a[::-1])

# b是个2行3列的二维数组
b = np.array([[1, 2, 3], [4, 5, 6]])

'''
将第2行的第2列到第3列的所有元素切片并打印
结果为[[5 6]]
'''
print(b[1:, 1:3])

'''
将第2列到第3列的所有元素切片并打印
结果为[[2 3]
      [5 6]]
'''
print(b[:, 1:3])

编程要求

在图像处理中,我们通常会将我们感兴趣的区域提取出来再进行处理,而这个感兴趣区域成为ROI(Region Of Interest)。本关的任务是根据提示,在右侧编辑器Begin-End处补充代码,根据测试用例的输入将ROI的提取并返回(ROI是一个矩阵)。

  • 具体要求请参见后续测试样例。

请先仔细阅读右侧上部代码编辑区内给出的代码框架,再开始你的编程工作!

测试说明

平台会对你编写的代码进行测试。你只需按要求完成get_roi(data, x, y, w, h)函数即可。其中:

  • data:待提取ROI的原始图像数据(其实就是个二维数组),类型为ndarray
  • x: ROI的左上角顶点的行索引,类型为int
  • y: ROI的左上角顶点的列索引,类型为int
  • w: ROI的宽,类型为int
  • h: ROI的高,类型为int

测试用例是一个字典,字典中image部分表示原始图像的像素数据,x部分表示ROI的左上角顶点的行索引,y部分表示ROI的左上角顶点的列索引,w部分表示ROI的宽,h部分表示ROI的高。

测试输入:

{'image':[[1, 2, 255, 255, 0], [255, 255, 0, 0, 3]], 'x':0, 'y':1, 'w':2, 'h':1}

预期输出:

[[  2 255 255]  [255   0   0]]

开始你的任务吧,祝你成功!

import numpy as np

def get_roi(data, x, y, w, h):
    '''
    提取data中左上角顶点坐标为(x, y)宽为w高为h的ROI
    :param data: 二维数组,类型为ndarray
    :param x: ROI左上角顶点的行索引,类型为int
    :param y: ROI左上角顶点的列索引,类型为int
    :param w: ROI的宽,类型为int
    :param h: ROI的高,类型为int
    :return: ROI,类型为ndarray
    '''

    #********* Begin *********#
    return data[x:x+h+1, y:y+w+1]
    #********* End *********#

题目意思描述太生涩了,让我没看懂含义自己用print(np.array(data[0][1:4]))这类的方法去试了很多遍。

python 根据索引提区数组中的多个元素 numpy根据索引取值_二维数组_03


python 根据索引提区数组中的多个元素 numpy根据索引取值_数据结构_04


python 根据索引提区数组中的多个元素 numpy根据索引取值_数据结构_04


python 根据索引提区数组中的多个元素 numpy根据索引取值_二维数组_06


python 根据索引提区数组中的多个元素 numpy根据索引取值_二维数组_07


python 根据索引提区数组中的多个元素 numpy根据索引取值_python_08