Python中使用Numpy的np.rot90随机旋转图像报NameError如何解决?
问题解决说明
你定义my_list时直接书写np.rot90(x,k=2)、np.rot90(x,k=3)属于即时函数调用,会在列表创建阶段就执行这两行代码,此时变量x还未定义,因此触发NameError。你需要将带固定k参数的旋转逻辑封装为仅接收图像作为输入的可调用对象,而非直接执行函数。
方法1:使用lambda封装参数
将不同旋转参数的逻辑都包装为单参数lambda函数,调用时只需传入图像即可:
import random import numpy as np images = [np.random.randint(100, size=(120, 120)) for _ in range(10)] # 每个元素都是仅接收图像x作为输入的可调用对象 my_list = [ lambda x: x, # 不旋转 lambda x: np.rot90(x, k=1), # 逆时针旋转90度 lambda x: np.rot90(x, k=2), # 旋转180度 lambda x: np.rot90(x, k=3) # 逆时针旋转270度 ] a = [random.choice(my_list)(image) for image in images]
方法2:使用偏函数固定参数
也可以用functools.partial提前固定np.rot90的k参数,生成新的单参数可调用对象:
import random import numpy as np from functools import partial images = [np.random.randint(100, size=(120, 120)) for _ in range(10)] my_list = [ lambda x: x, partial(np.rot90, k=1), partial(np.rot90, k=2), partial(np.rot90, k=3) ] a = [random.choice(my_list)(image) for image in images]
你之前修改为my_list = [lambda x: x,np.rot90, np.rot90]没有报错,是因为此时列表中后两个元素都是np.rot90函数本身,没有被即时调用,但两者默认都使用k=1的参数,自然无法实现不同旋转角度的需求。
内容的提问来源于stack exchange,提问作者jony
相关产品推荐
相关产品推荐

