第1关:Numpy 广播
任务描述
本关任务:给定两个不同形状的数组,求出他们的和。
相关知识
为了完成本关任务,你需要掌握:广播的规则。
广播
(Broadcast)
是numpy
对不同形状(shape)
的数组,进行数值计算的方式。 对数组的算术运算通常在相应的元素上进行,当运算中的2
个数组的形状不同时,numpy
将自动触发广播机制。如图所示:
广播的规则
- 让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加
1
补齐;- 输出数组的形状是输入数组形状的各个维度上的最大值;
- 如果输入数组的某个维度和输出数组的对应维度的长度相同,或者其长度为
1
时,这个数组能够用来计算,否则出错;- 当输入数组的某个维度的长度为
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 高级索引
任务描述
本关任务:给定一个二维数组,请以整数数组索引、布尔索引、花式索引三种方式,来获取我们需要的数组元素。
相关知识
为了完成本关任务,你需要掌握:
- 整数数组索引;
- 布尔索引;
- 花式索引。
NumPy
比一般的Python
序列提供更多的索引方式。除了基本的用整数和切片的索引外,数组还有整数数组索引、布尔索引及花式索引。整数数组索引
以下实例获取数组中 (0,0),(1,1) 和 (2,0) 位置处的元素。
In : x = np.arange(12).reshape((4,3))
In : y = x[[0, 1, 2],[0, 1, 0]]
In : y
Out: array([0, 4, 6])
布尔索引
以下实例获取数组中大于
7
的元素。
In : x = np.arange(12).reshape((4,3))
In : y = x[x > 7]
In : y
Out: array([8, 9, 10, 11])
花式索引
花式索引指的是利用整数数组进行索引。
花式索引根据索引数组的值,作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行。
花式索引跟切片不一样,它总是将数据复制到新数组中。
传入单个索引数组
以下实例获取数组的第
5、1、2、3
行。
In : x = np.arange(15).reshape((5,3))
In : y = x[[4, 0, 1, 2]]
In : y
Out: array([12, 13, 14]
[0, 1, 2]
[3, 4, 5]
[6, 7, 8])
传入多个索引数组
传入多个索引数组,则需要和
numpy.ix_
同时使用。numpy.ix_
:传入两个参数,第一个参数为数组索引,第二个参数为排列顺序。
In : x = np.arange(12).reshape((4,3))
In : y = x[np.ix_([1, 2],[2, 1, 0])]
In : y
Out: array([5, 4, 3]
[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
度后输出。相关知识
为了完成本关任务,你需要掌握:
- 控制迭代顺序;
- 修改数组元素值;
- 使用外部循环;
- 广播迭代。
NumPy
迭代器对象numpy.nditer
提供了一种灵活访问一个或者多个数组元素的方式。利用nditer
对象可以实现完成访问数组中的每一个元素,这项最基本的功能,使用标准的Python
迭代器接口,可以逐个访问每一个元素。
In : x = np.arange(6).reshape(2, 3)
In : for y in np.nditer(x):
print(y, end=" ")
Out:
0 1 2 3 4 5
控制迭代顺序
nditer
对象提供了一个命令参数,来控制迭代输出顺序,默认值是'K'
,即order='k'
。该默认值表示,按在存储器中的顺序输出。 同时nditer
中,还提供了两个参数,控制迭代器输出顺序:
for x in np.nditer(a, order='F') # Fortran order,即是列序优先;
for x in np.nditer(a.T, order='C') # C order,即是行序优先;
修改数组元素值
默认情况下,
nditer
将视待迭代遍历的数组为只读对象(read-only
),为了在遍历数组的同时,实现对数组元素值的修改,必须将可选参数op_flags
指定为read-write
或者write-only
的模式。
In : x = np.arange(6).reshape(2, 3)
In : for y in np.nditer(x, op_flags=["readwrite"]):
y[...] = 2 * y
In : print(x)
Out:
array([[ 0, 2, 4]
[ 6, 8, 10]])
使用外部循环
将一维的最内层的循环转移到外部循环迭代器,使得
numpy
的矢量化操作,在处理更大规模数据时,变得更有效率。
In : x = np.arange(6).reshape(2, 3)
In : for y in np.nditer(x, flags=['external_loop'], order='F'):
print(y)
Out:
[0, 3]
[1, 4]
[2, 5]
广播迭代
如果两个数组是可广播的,
nditer
组合对象能够同时迭代它们。 假设数组a
的维度为3*4
,数组b
的维度为1*4
,则使用以下迭代器(数组b
被广播到a
的大小)。
In : a = np.arange(12).reshape(3, 4)
In : b = np.arange(4)
In : for x, y in np.nditer([a, b]):
print("{}:{}".format(x,y), end=", ")
Out:
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
度后输出。 提示:
建议使用外部循环;
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()
05-30
2115
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)