Numpy 进阶

第1关:Numpy 广播

任务描述

本关任务:给定两个不同形状的数组,求出他们的和。

相关知识

为了完成本关任务,你需要掌握:广播的规则。

广播 (Broadcast)numpy 对不同形状 (shape) 的数组,进行数值计算的方式。 对数组的算术运算通常在相应的元素上进行,当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制。

如图所示:

广播的规则
  1. 让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐;
  2. 输出数组的形状是输入数组形状的各个维度上的最大值;
  3. 如果输入数组的某个维度和输出数组的对应维度的长度相同,或者其长度为 1 时,这个数组能够用来计算,否则出错;
  4. 当输入数组的某个维度的长度为 1 时,沿着此维度运算,都用此维度上的第一组值。

编程要求

首先用 arange() 生成一个数组,然后用 reshape() 方法,将数组切换成 4x3 的形状,最后再与 basearray 相加,输出它们的和。

请按照编程要求,补全右侧编辑器 Begin-End 内的代码。

测试说明

平台会对你编写的代码进行测试:

测试输入: 12; 预期输出: [[ 1 3 5] [ 4 6 8] [ 7 9 11] [10 12 14]]

代码:
import numpy as np

basearray = eval(input())
# *********** Begin ************ #
arr = np.arange(12).reshape((4, 3))

# ************ End ************* #
print("{} + \n{}".format(arr,basearray))
print("结果为:\n{}".format(basearray+arr))

第2关:Numpy 高级索引

任务描述

本关任务:给定一个二维数组,请以整数数组索引、布尔索引、花式索引三种方式,来获取我们需要的数组元素。

相关知识

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

  1. 整数数组索引;
  2. 布尔索引;
  3. 花式索引。

NumPy 比一般的 Python 序列提供更多的索引方式。除了基本的用整数和切片的索引外,数组还有整数数组索引、布尔索引及花式索引。

整数数组索引

以下实例获取数组中 (0,0),(1,1) 和 (2,0) 位置处的元素。

 
 
  1. In : x = np.arange(12).reshape((4,3))
  2. In : y = x[[0, 1, 2],[0, 1, 0]]
  3. In : y
  4. Out: array([0, 4, 6])
布尔索引

以下实例获取数组中大于 7 的元素。

 
 
  1. In : x = np.arange(12).reshape((4,3))
  2. In : y = x[x > 7]
  3. In : y
  4. Out: array([8, 9, 10, 11])
花式索引

花式索引指的是利用整数数组进行索引。

花式索引根据索引数组的值,作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行。

花式索引跟切片不一样,它总是将数据复制到新数组中。

传入单个索引数组

以下实例获取数组的第 5、1、2、3 行。

 
 
  1. In : x = np.arange(15).reshape((5,3))
  2. In : y = x[[4, 0, 1, 2]]
  3. In : y
  4. Out: array([12, 13, 14]
  5. [0, 1, 2]
  6. [3, 4, 5]
  7. [6, 7, 8])
传入多个索引数组

传入多个索引数组,则需要和 numpy.ix_ 同时使用。 numpy.ix_:传入两个参数,第一个参数为数组索引,第二个参数为排列顺序。

 
 
  1. In : x = np.arange(12).reshape((4,3))
  2. In : y = x[np.ix_([1, 2],[2, 1, 0])]
  3. In : y
  4. Out: array([5, 4, 3]
  5. [8, 7, 6])

编程要求

首先,利用花式索引获取 arr 数组第 line 行(至少两行)的数组 a;然后,利用整数数组索引获取数组四个角(按行优先的顺序获取)的元素得到数组 b;最后,再利用布尔索引获取大于 10 的元素得到数组 c,并输出 c

请按照编程要求,补全右侧编辑器 Begin-End 内的代码。

测试说明

平台会对你编写的代码进行测试:

测试输入: 1,2,3,4; 预期输出: [16 19]

代码:
import numpy as np

'''
arr为一个ndarray类型的数组,line为花式索引的索引数组
'''
def advanced_index(arr,line):
    # ********** Begin *********** #
    a = arr[line]
    b = a[[0, 0, (len(line)-1),(len(line)-1)],[0, 3, 0, 3]]
    c = b[b > 10]
    # *********** End ************ #
    return c

def main():
    line = list(map(lambda x:int(x),input().split(",")))
    arr = np.arange(24).reshape(6, 4)
    print(advanced_index(arr,line))

if __name__ == '__main__':
    main()

第3关:Numpy 迭代数组

任务描述

本关任务:利用本关相关知识,将一个 ndarray 类型的数组,顺时针旋转 90 度后输出。

相关知识

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

  1. 控制迭代顺序;
  2. 修改数组元素值;
  3. 使用外部循环;
  4. 广播迭代。

NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式。利用nditer对象可以实现完成访问数组中的每一个元素,这项最基本的功能,使用标准的 Python 迭代器接口,可以逐个访问每一个元素。

 
 
  1. In : x = np.arange(6).reshape(2, 3)
  2. In : for y in np.nditer(x):
  3. print(y, end=" ")
  4. Out:
  5. 0 1 2 3 4 5
控制迭代顺序

nditer 对象提供了一个命令参数,来控制迭代输出顺序,默认值是 'K',即 order='k'。该默认值表示,按在存储器中的顺序输出。 同时 nditer 中,还提供了两个参数,控制迭代器输出顺序:

 
 
  1. for x in np.nditer(a, order='F') # Fortran order,即是列序优先;
  2. for x in np.nditer(a.T, order='C') # C order,即是行序优先;
修改数组元素值

默认情况下,nditer 将视待迭代遍历的数组为只读对象(read-only),为了在遍历数组的同时,实现对数组元素值的修改,必须将可选参数 op_flags 指定为 read-write 或者 write-only 的模式。

 
 
  1. In : x = np.arange(6).reshape(2, 3)
  2. In : for y in np.nditer(x, op_flags=["readwrite"]):
  3. y[...] = 2 * y
  4. In : print(x)
  5. Out:
  6. array([[ 0, 2, 4]
  7. [ 6, 8, 10]])
使用外部循环

将一维的最内层的循环转移到外部循环迭代器,使得 numpy 的矢量化操作,在处理更大规模数据时,变得更有效率。

 
 
  1. In : x = np.arange(6).reshape(2, 3)
  2. In : for y in np.nditer(x, flags=['external_loop'], order='F'):
  3. print(y)
  4. Out:
  5. [0, 3]
  6. [1, 4]
  7. [2, 5]
广播迭代

如果两个数组是可广播的,nditer 组合对象能够同时迭代它们。 假设数组 a 的维度为 3*4,数组 b 的维度为 1*4,则使用以下迭代器(数组 b 被广播到 a 的大小)。

 
 
  1. In : a = np.arange(12).reshape(3, 4)
  2. In : b = np.arange(4)
  3. In : for x, y in np.nditer([a, b]):
  4. print("{}:{}".format(x,y), end=", ")
  5. Out:
  6. 0:1, 1:2, 2:3, 3:4, 4:1, 5:2, 6:3, 7:4, 8:1, 9:2, 10:3, 11:4,

编程要求

根据提示,在右侧编辑器 Begin-End 内补充代码,将一个 ndarray 类型的数组顺时针旋转 90 度后输出。 提示:

 
 
  1. 建议使用外部循环;
  2. np.vstack()可以将两个数组竖直堆叠成为新的数组。

测试说明

平台会对你编写的代码进行测试:

测试输入: np.arange(4).reshape(2,2); 预期输出: [[2, 0] [3, 1]]

代码:
import numpy as np
'''传入的参数为ndarray类型数组'''
def rotate_array(arr):
    # ******* Begin *******
    result=[list(row) for row in zip(*arr)]#将arr转置
    result=[row[::-1] for row in result]#将result逆转
    result=np.array(result)
    # ******* End ******** #
    return result

def main():
    arr = eval(input())
    print(rotate_array(arr))

if __name__ == '__main__':
    main()

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值