任务描述
本关任务:利用本关相关知识,将一个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的维度为34,数组b的维度为14,则使用以下迭代器(数组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 ******* #
indx_1=[]
for i in np.nditer(arr,flags=['external_loop'], order='F'):
indx_1.append(i)
#先使用外部循环,得到列序优先的多个一维数组
indx_2 = np.array(indx_1)
row = list(range(indx_2.shape[0]))
#shape[0]代表该矩阵的行数,shape[1]代表列数
col = list(range(indx_2.shape[1]))
col.reverse()
result = indx_2[np.ix_(row,col)]
# ******* End ******** #
return result
def main():
arr = eval(input())
print(rotate_array(arr))
if __name__ == '__main__':
main()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)