Python列表转指定格式NumPy数组 修复Collatz猜想Matplotlib绘图错误
异常原因
- 第一个问题是迭代过程中向列表追加值的逻辑错误:只有计算奇数步的考拉兹值时才会把数据追加到
poslist和numlist,偶数步计算出的新值、以及最终终止值1都没有被追加到列表,导致两个列表缺失大量有效数据,长度远小于实际迭代步数。 - 第二个问题是绘图传参逻辑错误:你构造的
axislist是形状为(2, N)的二维NumPy数组,matplotlib.pyplot.plot()传入二维数组时会默认将数组的每一列作为单独的折线绘制,才会出现大量无意义的彩色线条。同时你没有明确指定x轴和y轴的对应关系,自然无法得到预期的步长-数值折线。
修复代码
import matplotlib.pyplot as plt poslist = [] numlist = [] i = 1 num = int(input('Number to check?')) plt.title(f'{num}: Collatz Graph') plt.xlabel('Step') plt.ylabel('Value') # 初始值加入列表 poslist.append(i) numlist.append(num) while num != 1: i += 1 if num % 2 == 0: num = num // 2 else: num = num * 3 + 1 # 每步计算完成后统一追加数据,避免分支遗漏 poslist.append(i) numlist.append(num) # 直接传入x、y轴列表即可,不需要额外转换为NumPy数组 plt.plot(poslist, numlist) plt.show()
关键修改说明
- 调整了循环判断逻辑,将列表追加操作放到循环公共分支,每步迭代的数值都会被记录,不会遗漏偶数步和最终终止值1
- 绘图时直接传入
poslist作为x轴参数、numlist作为y轴参数,符合plt.plot()的常规传参规则,不需要额外构造二维数组
内容的提问来源于stack exchange,提问作者Commodore 64
相关产品推荐
相关产品推荐

