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

MNIST数字1流形学习可视化报错:空数组问题排查

解决MNIST筛选数字1时Isomap报错的问题

这个错误的核心原因很明确:你通过mnist.data[mnist.target == 1]筛选出的样本是空的,所以后续Isomap因为没有数据可以处理而抛出ValueError。咱们一步步拆解问题和解决方案:

最可能的原因:标签类型不匹配

从sklearn.datasets.fetch_openml获取的MNIST数据集,target标签默认是字符串类型(比如标签是'1'而不是整数1)。你用整数1去和字符串标签比较,自然匹配不到任何样本,结果就是空数组。

排查验证

先执行下面的代码确认标签的类型和取值:

print("Target数据类型:", mnist.target.dtype)
print("所有唯一标签:", mnist.target.unique())

如果输出里标签是字符串(比如dtype: object,唯一标签是['0' '1' ... '9']),那就是这个问题。

解决办法

有两种方式修正:

  1. 直接用字符串匹配筛选:
    # 用字符串'1'替代整数1
    data = mnist.data[mnist.target == '1'][::4]
    
  2. 把target转换为整数类型(后续所有数字筛选都能统一用整数):
    # 先转换标签类型
    mnist.target = mnist.target.astype(int)
    # 再正常筛选
    data = mnist.data[mnist.target == 1][::4]
    

额外验证步骤

修正筛选条件后,先确认data是否有数据:

print("筛选后的样本数量:", data.shape[0])

如果输出大于0,再运行你的Isomap可视化代码就不会报错了。

修正后的完整代码示例

from sklearn.manifold import Isomap
import matplotlib.pyplot as plt

# 先确保标签类型正确(二选一即可)
# 方式1:直接用字符串筛选
data = mnist.data[mnist.target == '1'][::4]
# 方式2:转换标签为整数后筛选
# mnist.target = mnist.target.astype(int)
# data = mnist.data[mnist.target == 1][::4]

# 验证数据非空
assert data.shape[0] > 0, "筛选后无数据,请检查标签匹配条件"

fig, ax = plt.subplots(figsize=(10, 10))
model = Isomap(n_neighbors=5, n_components=2, eigen_solver='dense')
plot_components(data, model, images=data.reshape((-1, 28, 28)), ax=ax, thumb_frac=0.05, cmap='gray_r')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:47:26