Python||ValueError: Found array with dim 3. LinearDiscriminantAnalysis expected <= 2.

距离新的一年还有14天,是时候要冲冲KPI了(ง •_•)ง

没错,这又是一篇改错的水贴,百无聊赖记录一下改错经历,虽然期末大作业还没写U•ェ•*U

一、问题描述

        应用线性判别分析Linear Discriminant Analysis对经典手写数字数据集进行分类

        首先导一下要用到的包和数据集,然后用LinearDiscriminantAnalysis()对数据集进行训练,然后就报错了ValueError: Found array with dim 3. LinearDiscriminantAnalysis expected <= 2.

import numpy as np

# 数字图像 
x_train = np.load('mnist_x_train.npy') # 训练集数据 
x_test = np.load('mnist_x_test.npy') # 测试集数据 
# 对应的标签,即 0, 1, 2, ..., 9 
y_train = np.load('mnist_y_train.npy') 
y_test = np.load('mnist_y_test.npy')

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

# 应用Linear Discriminant Analysis来分类
LDA = LinearDiscriminantAnalysis()
LDA.fit(x_train, y_train)

Python||ValueError: Found array with dim 3. LinearDiscriminantAnalysis expected <= 2._第1张图片

 二、原因分析

        这报告翻译过来就是 发现输入的数组是3维的,而函数LinearDiscriminantAnalysis()要求输入的函数维度小于等于2。

        看了一眼变量,系统果然没有冤枉我( ̄(工) ̄)

Python||ValueError: Found array with dim 3. LinearDiscriminantAnalysis expected <= 2._第2张图片

三、解决问题

        既然知道了原因,那问题就好解决啦,使用reshape函数即可。

        在训练之前补上一下代码,问题解决~( ̄▽ ̄)~*

x_train_2D = (x_train.reshape(x_train.shape[0], x_train.shape[1] * x_train.shape[2]))
x_test_2D = (x_test.reshape(x_test.shape[0], x_test.shape[1] * x_test.shape[2]))

Python||ValueError: Found array with dim 3. LinearDiscriminantAnalysis expected <= 2._第3张图片


补充小知识 

1. reshape函数的官方文档献上:numpy.reshape — NumPy v1.21 Manual

Python||ValueError: Found array with dim 3. LinearDiscriminantAnalysis expected <= 2._第4张图片

reshape函数:改变数组的维度,不改变数据

参数:

  • shape:int或tuple的整数,新的形状应该与原始形状兼容。如果是整数,则结果将是该长度的1-D数组。一个形状维度可以是-1。在这种情况下,从数组的长度和其余维度推断该值。
  • order:{'C','F','A'}可选,使用此索引顺序读取a的元素,并使用此索引顺序将元素放置到重新形成的数组中。'C'意味着使用C样索引顺序读取/写入元素,最后一个轴索引变化最快,回到第一个轴索引变化最慢。'F'意味着使用Fortran样索引顺序读取/写入元素,第一个索引变化最快,最后一个索引变化最慢。注意,'C'和'F'选项不考虑底层数组的内存布局,而只是参考索引的顺序。'A'意味着在Fortran类索引顺序中读/写元素,如果a 是Fortran 在内存中连续的,否则为C样顺序。
     

2. reshape()函数是对数组array进行操作的,对list结果是会报错的,因此使用该函数前先确保变量的类型是数组

Python||ValueError: Found array with dim 3. LinearDiscriminantAnalysis expected <= 2._第5张图片

3. reshape()函数里若使用-1,那么Numpy会根据剩下的维度计算出数组的另外一个属性值

    简单来说就是,如果知道列数为2,行数未知,可写为reshape(-1, 2) ;如果知道行数为2,列数未知,可写为reshape(2, -1)

Python||ValueError: Found array with dim 3. LinearDiscriminantAnalysis expected <= 2._第6张图片 

 4. a.shape()  #报错:AttributeError: 'list' object has no attribute 'shape'

可参考文章:TypeError系列之:TypeError: 'tuple' object is not callable._NuerNuer的博客-CSDN博客TypeError: 'tuple' object is not callable。这又是一个typeerror。我们翻译一下这个报错信息,tuple对象是不可调用的,这是什么意思。只有可以内部有函数对象才可以调用(call)函数,而turple是一个数据类型,它本身是不封装函数的,因此如果去通过“.”的方式去调用函数,这样的方式是错误的。我们来看着两组代码来分析:import nu...https://blog.csdn.net/qq_41368074/article/details/105737846

你可能感兴趣的:(DeBug大作战!!,python)