NumPy基础及取值操作 educoder头歌实践作业

任务描述

本关任务:根据本关所学知识,补全右侧代码编辑器中缺失的代码,完成程序的编写并通过所有测试用例。

相关知识

为了完成本关任务,你需要掌握:

  • 怎样安装 NumPy
  • 什么是 ndarray对象;
  • 如何实例化 ndarray对象。

怎样安装NumPy

本地想要安装 NumPy其实非常简单,进入命令行,输入 pip install numpy即可。

什么是ndarray对象

NumPy为什么能够受到各个数据科学从业人员的青睐与追捧,其实很大程度上是因为 NumPy在向量计算方面做了很多优化,接口也非常友好(总之就是用起来很爽)。而这些其实都是在围绕着 NumPy的一个 核心数据结构 ndarray

ndarray的全称是 N-Dimension Arrary,字面意义上其实已经表明了一个 ndarray对象就是一个 N维数组。但要注意的是, ndarray同质的。同质的意思就是说 N 维数组里的所有元素必须是属于同一种数据类型的(PS: python 中的 list 是异质的)

ndarray对象实例化好了之后,包含了一些基本的属性。比如 shapendimsizedtype。其中:

  • shape: ndarray对象的形状,由一个 tuple表示;
  • ndim: ndarray对象的维度;
  • size: ndarray对象中元素的数量;
  • dtype: ndarray对象中元素的数据类型,例如 int64float32等。

来看个例子,假设现在有一个 35列的矩阵( ndarray)如下:

那么该 ndarrayshape(3, 5)(代表 35列);

ndim2(因为矩阵有行和列两个维度);

size15(因为矩阵总共有 15个元素);

dtypeint32(因为矩阵中元素都是整数,并且用 32位整型足够表示矩阵中的元素)。

示例代码如下:

如何实例化ndarray对象

实例化 ndarray对象的函数有很多种,但最为常用的函数是 arrayzerosones以及 empty

使用array函数实例化ndarray对象

如果你手头上有一个 pythonlist,想要将这个 list转成 ndarray,此时可以使用 NumPy中的 array函数将 list中的值作为初始值,来实例化一个 ndarray对象。代码如下:

使用zeros,ones,empty函数实例化ndarray对象

通常在写代码的时候,数组中元素的值一般都喜欢先初始化成 0,如果使用 array的方式实例化 ndarray对象的话,虽然能实现功能,但显得很麻烦( 首先要有一个全是 0list )。那有没有简单粗暴的方式呢,有!!那就是 zeros函数,你只需要把 ndarrayshape作为参数传进去即可。代码如下:

如果想把数组中的元素全部初始化成 1,聪明的你应该能想到就是用 ones函数, ones的用法与 zeros一致。代码如下:

如果 01大法满足不了你,想要用随机值作为初始值来实例化 ndarray对象, empty函数能够满足你。 empty的使用方式与 zerosones如出一辙,代码如下:

编程要求

根据提示,在右侧编辑器 Begin-End中填充代码,根据测试用例的输入,实例化出对应的 ndarray对象并打印。

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

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

测试说明

平台会对你编写的代码进行测试,对比你输出的数值与实际正确的数值,只有所有数据全部计算正确才能进入下一关。

  • shape:为需要实例化出来的 ndarray对象的 shape
  • data:表示需要实例化出来的 ndarray对象中元素的值。

例如: {'shape':[1, 2], 'data':[[1, 2]]}表示 ndarray对象的形状为 12列,第 1行第 1列的值为 1,第 1行第 2列的值为 2

测试输入: {'shape':[1, 2], 'data':[[1, 2]]}

预期输出: [[1 2]]

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

import numpy as np

def print_ndarray(input_data):

”’

实例化ndarray对象并打印

:param input_data: 测试用例,类型为字典类型

:return: None

”’

* Begin *

a=np.array(input_data[‘data’])

print(a)

* End *

任务描述

本关任务:根据本关所学知识,补全右侧代码编辑器中缺失的代码,完成程序的编写并通过所有测试用例。

相关知识

为了完成本关任务,你需要掌握:怎样改变 ndarray对象的形状。

怎样改变 ndarray对象的形状

改变形状

上一关介绍了怎样实例化 ndarray对象,比如想实例化一个 34列的二维数组,并且数组中的值全为 0。就可能会写如下代码:

那如果想把 a变成 43列的二维数组,怎么办呢?比较聪明的同学可能会想到这样的代码:

最后你会发现,这样的代码可以完成功能,但是这种直接改属性的方式太粗暴了,不符合良好的编程规范。

更加 优雅的解决方式是使用 NumPy为我们提供了一个用来改变 ndarray对象的 shape的函数,叫 reshape

NumPy为了照顾偏向于面向对象或者这偏向于面向过程这两种不同风格的程序员,提供了 2种调用 reshape 函数的方式(其实很多函数都提供了两种风格的接口)。

如果你更偏向于面向对象,那么你可以想象成 ndarray对象中提供好了一个叫 reshape成员函数。代码如下:

如果你更偏向于面向过程, NumPy在它的作用域内实现了 reshape函数。代码如下:

PS:不管是哪种方式的 reshape ,都不会改变原 ndarray 的形状,而是将源 ndarray 进行深拷贝并进行变形操作,最后再将变形后的数组返回出去。也就是说如果代码是 np.reshape(a, (4, 3)) 那么 a 的形状不会被修改!

如果想优雅的直接改变源 ndarray的形状,可以使用 resize函数。代码如下:

小技巧

有的时候懒得去算每个维度上的长度是多少,比如现在有一个 68列的 ndarray,然后想把它变形成有 2列的 ndarray(行的数量我懒得去想),此时我们可以在行的维度上传个 -1即可,代码如下:

也就是说在变形操作时,如果某个维度上的值为 -1,那么该维度上的值会根据其他维度上的值自动推算。

PS-1 虽好,可不能贪杯!如果代码改成 a = a.reshape((-1, -1))NumPy 会认为你是在刁难他,并向你抛出异常 ValueError: can only specify one unknown dimension

编程要求

根据提示,在右侧编辑器 Begin-End中填充代码,根据测试用例的输入,将列表转换成 ndarray后变形成一维数组并将其打印。

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

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

测试说明

平台会对你编写的代码进行测试,对比你输出的数值与实际正确的数值,只有所有数据全部计算正确才能进入下一关。

测试输入: [[1, 2, 3], [4, 5, 6]] 预期输出: [1, 2, 3, 4, 5, 6]

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

import numpy as np

def reshape_ndarray(input_data):

”’

将ipnut_data转换成ndarray后将其变形成一位数组并打印

:param input_data: 测试用例,类型为list

:return: None

”’

* Begin *

after_reshape=np.array(input_data).reshape(-1)

print(after_reshape)

* End *

任务描述

本关任务:根据本关所学知识,补全右侧代码编辑器中缺失的代码,完成程序的编写并通过所有测试用例。

相关知识

为了完成本关任务,你需要掌握:

  • 算术运算;
  • 矩阵运算;
  • 简单统计。

算术运算

如果想要对 ndarray对象中的元素做 elementwise(逐个元素地)的算术运算非常简单,加减乘除即可。代码如下:

矩阵运算

相同 shape的矩阵 A与矩阵 B之间想要做 elementwise运算也很简单,加减乘除即可。代码如下:

细心的同学应该发现了, *只能做 elementwise运算,如果想做真正的矩阵乘法运算显然不能用 *NumPy提供了 @dot函数来实现矩阵乘法。代码如下:

简单统计

有的时候想要知道 ndarray对象中元素的和是多少,最小值是多少,最小值在什么位置,最大值是多少,最大值在什么位置等信息。这个时候可能会想着写一个循环去遍历 ndarray对象中的所有元素来进行统计。 NumPy为了解放我们的双手,提供了 summinmaxargminargmax等函数来实现简单的统计功能,代码如下:

有的时候,我们在统计时需要根据轴来统计。举个例子,公司员工的基本工资,绩效工资,年终奖的信息如下:

工号基本工资绩效工资年终奖130004000200002270055002500032800300015000

这样一个表格很明显,可以用 ndarray来存储。代码如下:

info实例化之后就有了维度和轴的概念,很明显 info是个二维数组,所以它的 维度是 2 。维度为 2换句话来说就是 info两个轴: 0 号轴与 1 号轴(轴的编号从 0 开始算)。轴所指的方向如下图所示:

如果想要统计下这 3位员工中基本工资、绩效工资与年终奖的最小值与最大值( 也就是说分别统计出每一列中的最小与最大值)。我们可以沿着 0号轴来统计。想要实现沿着哪个轴来统计,只需要修改 axis即可,代码如下:

PS:当没有修改 axis 时, axis 的值默认为 None 。意思是在统计时会把 ndarray 对象中所有的元素都考虑在内。

编程要求

根据提示,在右侧编辑器 Begin-End处补充代码,根据测试用例的输入,打印每行的最大值的位置。

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

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

测试说明

平台会对你编写的代码进行测试,对比你输出的数值与实际正确的数值,只有所有数据全部计算正确才能进入下一关。

测试输入: [[0.2, 0.7, 0.1], [0.1, 0.3, 0.6]] 预期输出: [1 2]

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

import numpy as np

def get_answer(input_data):

”’

将input_data转换成ndarray后统计每一行中最大值的位置并打印

:param input_data: 测试用例,类型为list

:return: None

”’

* Begin *

print(np.array(input_data).argmax(axis=1))

* End *

任务描述

本关任务:根据本关所学知识,补全右侧代码编辑器中缺失的代码,完成程序的编写并通过所有测试用例。

相关知识

为了完成本关任务,你需要掌握:

  • 简单随机数生成;
  • 概率分布随机数生成;
  • 随机种子。

简单随机数生成

NumPyrandom模块下提供了许多生成随机数的函数,如果对于随机数的概率分布没有什么要求,则通常可以使用 random_samplechoicerandint等函数来实现生成随机数的功能。

random_sample

random_sample用于生成区间为 [0, 1]的随机数,需要填写的参数 size表示生成的随机数的形状,比如 size=[2, 3]那么则会生成一个 23列的 ndarray,并用随机值填充。示例代码如下:

choice

如果想模拟像掷骰子、扔硬币等这种随机值是离散值,而且知道范围的可以使用 choice实现。 choice的主要参数是 asizereplacea是个一维数组,代表你想从 a中随机挑选; size是随机数生成后的形状。假如模拟 5次掷骰子, replace用来设置是否可以取相同元素, True表示可以取相同数字; False表示不可以取相同数字,默认是 True,代码如下:

randint

randint的功能和 choice差不多,只不过 randint只能生成整数,而 choice生成的数与 a有关,如果 a中有浮点数,那么 choice会有概率挑选到浮点数。

randint的参数有 3个,分别为 lowhighsize。其中 low表示随机数生成时能够生成的最小值, high表示随机数生成时能够生成的最大值减 1。也就是说 randint生成的随机数的区间为 [low, high)。假如模拟 5次掷骰子,代码如下:

概率分布随机数生成

高斯分布又称为正态分布,其分布图形如下:

上图中横轴为随机变量的值( 在这里可以看成是产生的随机值),纵轴表示随机变量对应的概率( 在这里可以看成是随机值被挑选到的概率)。

其实在日常生活中有很多现象或多或少都符合高斯分布。比如某个地方的高考分数,一般来说高考分数非常低和高考分数非常高的学生都比较少,而分数中规中矩的学生比较多,如果所统计的数据足够大,那么高考分数的概率分布也会和上图一样, 中间高,两边低

想要实现根据高斯分布来产生随机值,可以使用 normal函数。示例代码如下:

其中 normal函数除了 size参数外,还有两个比较重要的参数就是 locscale,它们分别代表高斯分布的 均值方差loc影响的分布中概率最高的点的位置,假设 loc=2,那么分布中概率最高的点的位置就是 2。下图体现了 loc对分布的影响,其中蓝色 f分布的 loc=0,红色分布的 loc=5

scale影响的是分布图形的胖瘦, scale越小,分布就越又高又瘦, scale越大,分布就越又矮又胖。下图体现了 scale对分布的影响,其中蓝色分布的 scale=0.5,红色分布的 scale=1.0

所以,想要根据均值为 1,方差为 10的高斯分布来生成 5个随机值,代码如下:

随机种子

前面说了这么多随机数生成的方法,那么随机数是怎样生成的呢?其实计算机产生的随机数是由随机种子根据一定的计算方法计算出来的数值。 所以只要计算方法固定,随机种子固定,那么产生的随机数就不会变!

如果想要让每次生成的随机数不变,那么就需要设置随机种子( 随机种子其实就是一个 0232−1 的整数)。设置随机种子很长简单,调用 seed函数并设置随机种子即可,代码如下:

编程要求

根据提示,在右侧编辑器 Begin-End处补充代码,将测试用例输入打乱顺序并返回打乱结果。

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

注意:评测程序内部已经设置好了随机种子,为了顺利评测,请使用 np.random.choice()函数来实现打乱顺序。

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

测试说明

平台会对你编写的代码进行测试,对比你输出的数值与实际正确的数值,只有所有数据全部计算正确才能进入下一关。

测试输入: [1, 2, 3, 4, 5, 6] 预期输出: [4, 3, 5, 1, 2, 6]

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

import numpy as np

def shuffle(input_data):

”’

打乱input_data并返回打乱结果

:param input_data: 测试用例输入,类型为list

:return: result,类型为list

”’

保存打乱的结果

result = []

* Begin *

result=list(np.random.choice(a=input_data,size=len(input_data),replace=False))

* End *

return result

任务描述

本关任务:根据本关所学知识,补全右侧代码编辑器中缺失的代码,完成 ROI提取的功能。

相关知识

为了完成本关任务,你需要掌握:

  • 索引;
  • 遍历;
  • 切片。

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

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

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

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

b=data[x:x+h+1,y:y+w+1]

return b

* End *

Original: https://blog.csdn.net/weixin_52134163/article/details/127486227
Author: 202012720张辰
Title: NumPy基础及取值操作 educoder头歌实践作业

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/757844/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球