为何IndexError: tuple index out of range在Python3.7出现而3.6.6不出现?如何解决?
问题原因分析
这个IndexError的核心原因是新版本的matplotlib/numpy对scatter函数的输入参数维度匹配要求更严格,你的Python3.7环境对应的库版本恰好触发了这个检查:
你的data_x里的每个元素是np.random.rand(1,)生成的长度为1的numpy数组(shape=(1,)),而内层循环的y2是单个数值(标量)。在Python3.6.6对应的旧版本库中,会自动将标量广播为和数组长度一致的序列,所以不会报错;但在Python3.7环境的新版本库中,scatter要求x和y参数的维度/长度必须严格匹配,否则会在内部处理时触发tuple index out of range错误。
修复方案(任选其一即可)
方案1:直接提取数组中的标量值
修改scatter调用时的x参数,取数组的唯一元素:
sc = ax.scatter(x[0], y2, c=z2, cmap=cm, norm=mplcol.Normalize(vmin=0, vmax=1))
方案2:修改data_x的生成方式,直接生成标量
既然你只需要单个随机值,没必要生成长度为1的数组,直接用np.random.rand()(不带参数)生成标量:
data_x = [np.random.rand(), np.random.rand()]
方案3:将y2转为长度为1的数组
把标量y2包装成和x形状一致的数组:
sc = ax.scatter(x, np.array([y2]), c=z2, cmap=cm, norm=mplcol.Normalize(vmin=0, vmax=1))
验证说明
以上三种方案都能让x和y的输入维度完全匹配,满足新版本matplotlib的参数要求,从而在Python3.7环境中正常运行代码,同时也兼容Python3.6.6的旧版本环境。
内容的提问来源于stack exchange,提问作者naughty_waves
相关产品推荐
相关产品推荐

