You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中x与y维度不匹配报错排查及Collatz散点图绘制问题

Collatz序列散点图:解决尺寸不匹配错误与优化可视化

一、搞定“x and y must be the same size”错误

这个报错的本质很简单:传给plt.scatter()的x数组和y数组长度不一样。比如你定义了x是1到1000的所有数,但计算步数的y列表漏了几个数(循环时不小心跳过、函数异常没处理都可能导致)。

典型错误代码示例

假设你的代码是类似这样,就会触发错误:

import matplotlib.pyplot as plt

def collatz_steps(n):
    steps = 0
    while n != 1:
        if n % 2 == 0:
            n = n // 2
        else:
            n = 3 * n + 1
        steps += 1
    return steps

start_numbers = range(1, 1000)
step_counts = []
for num in start_numbers:
    # 这里跳过了10的倍数,导致step_counts比start_numbers短
    if num % 10 == 0:
        continue
    step_counts.append(collatz_steps(num))

plt.scatter(start_numbers, step_counts)
plt.show()

修正方法

保证每个起始数字都对应一个步数结果,别跳过任何数,同时处理n=1的边界情况(步数为0):

import matplotlib.pyplot as plt

def collatz_steps(n):
    if n == 1:
        return 0
    steps = 0
    current = n
    while current != 1:
        if current % 2 == 0:
            current = current // 2
        else:
            current = 3 * current + 1
        steps += 1
    return steps

max_num = 1000
# x是1到max_num的所有数
start_numbers = list(range(1, max_num + 1))
# 每个数都计算步数,y列表长度和x完全一致
step_counts = [collatz_steps(num) for num in start_numbers]

二、优化散点图样式,看清数据模式

默认散点太密,堆在一起根本看不出规律,调整这几个参数就能解决:

  • s:缩小标记尺寸,比如设成s=3
  • alpha:加透明度,比如alpha=0.6,重叠的点会显示得更深
  • marker:用更紧凑的标记,比如marker='.'(圆点)或marker='x'
  • edgecolors='none':去掉标记边缘的线条,减少视觉干扰

优化后的绘图代码

plt.figure(figsize=(10, 6))
plt.scatter(start_numbers, step_counts, s=3, alpha=0.6, marker='.', edgecolors='none')

plt.title('Collatz序列:起始数字 vs 迭代步数')
plt.xlabel('起始数字')
plt.ylabel('迭代至1的步数')
plt.grid(True, linestyle='--', alpha=0.3)
plt.show()

进阶玩法:区分奇偶数字

如果想突出奇偶起始数的步数差异,可以给不同类型的点上色:

# 偶数用蓝色,奇数用橙色
colors = ['#1f77b4' if num % 2 == 0 else '#ff7f0e' for num in start_numbers]

plt.figure(figsize=(10, 6))
plt.scatter(start_numbers, step_counts, s=3, alpha=0.6, marker='.', edgecolors='none', c=colors)
plt.title('Collatz序列:起始数字 vs 迭代步数(奇偶区分)')
plt.xlabel('起始数字')
plt.ylabel('迭代至1的步数')
plt.legend(['偶数', '奇数'])
plt.grid(True, linestyle='--', alpha=0.3)
plt.show()

内容的提问来源于stack exchange,提问作者sumi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 13:01:19