Python 将 np 4D 数组重塑为 2D 数组。 Kaggle图像数据
Python reshaping a np 4D array into a 2D array. Kaggle Image data
我正在尝试将 4 维数组转换为 2 维数组以使用 sklearn SVM 模型,但是当我尝试使用模型中的数据时它给我带来了问题。
所以我将数据分成训练数据和测试数据,然后像这样将其转换为 np 数组。
#Train data
npXt = np.array(x_train)
npYt = np.array(y_train)
#Eval test data
npXT = np.array(x_test)
npYT = np.array(y_test)
那我看这样的形状
npXt.shape
这给了我这个,
(28709, 48, 48, 1)
我尝试通过这样做来改变它;
npXt.transpose((28709, 48, 48, 1)).reshape(np.prod(npXt.shape[:2]),-1)
但是给出这个错误。
AxisError Traceback (most recent call last)
<ipython-input-8-2682876229f4> in <module>()
----> 1 npXt.transpose((28709, 48, 48, 1)).reshape(np.prod(npXt.shape[:2]),-1)
AxisError: axis 28709 is out of bounds for array of dimension 4
我做错了什么?
感谢您对此的任何帮助
更新:
感谢您的所有建议:
我试过了,有这样的错误:
ValueError: bad input shape (28709, 7)
所以这就是我要解决的问题。我认为问题在于我目前没有重塑阵列。
所以我像这样下载数据并且工作正常:
x_train, y_train, x_test, y_test = aiu.getKaggleData(file,numClass)
结果如下:
Creating Testing and Training datasets
Filling datasets
Transforming data to fit model's needs
Normalizing traing/testing datasets
Reshaping data
28709 train samples
3589 test samples
我希望这个和这个可以与我构建的另一个模型一起使用。
接下来我像这样构建 SVM 模型:
clf = SVC(C=0.01, kernel='linear', decision_function_shape='ovo', probability=True)
然后像这样把train和test数据转换成np数组
#Train data
npXt = np.array(x_train)
npYt = np.array(y_train)
#Eval test data
npXT = np.array(x_test)
npYT = np.array(y_test)
然后使用建议的内容
my_array = np.ones((28709, 48, 48, 1))
newXTrain = np.transpose( my_array ).reshape(np.prod(npXt.shape[:2]),-1)
print(newXTrain.shape)
print(npYt.shape)
这给了我这个:
(1378032, 48) #for data
(28709, 7) #for lables
然后我尝试像这样训练模型
clf.fit(newXTrain,npYt)
这给了我这个
raise ValueError("bad input shape {0}".format(shape))
ValueError: bad input shape (28709, 7)
感谢您迄今为止的所有帮助
我什至试过了,但仍然报错:
newXTrain = np.transpose( my_array ).reshape(np.prod(npXt.shape[:1]),-1)
这让我看起来很有希望。
(28709, 2304)
(28709, 7)
但给出了与 ValueError: bad input shape (28709, 7)
相同的错误
我认为这是您使用转置的方式。应该作为参数传递的应该是位置列表,在您的情况下是 0 到 3 之间的整数。
我猜你正在尝试反转 npXt 的索引,所以也许应该将 (3,2,1,0) 代替 (28709,48,48,1) 作为转置函数的参数。
我不明白你为什么在重塑之前转置数组
但是你使用的转置方式不对。
应该是:
my_array = np.ones((28709, 48, 48, 1))
np.transpose( my_array ).reshape(np.prod(npXt.shape[:2]),-1)
如果您将元组传递给转置函数,它会将其解释为矩阵轴索引的新顺序。因此转置轴号 28709 在这里没有意义。
如果你想重塑你可能根本不需要转置
我正在尝试将 4 维数组转换为 2 维数组以使用 sklearn SVM 模型,但是当我尝试使用模型中的数据时它给我带来了问题。 所以我将数据分成训练数据和测试数据,然后像这样将其转换为 np 数组。
#Train data
npXt = np.array(x_train)
npYt = np.array(y_train)
#Eval test data
npXT = np.array(x_test)
npYT = np.array(y_test)
那我看这样的形状
npXt.shape
这给了我这个,
(28709, 48, 48, 1)
我尝试通过这样做来改变它;
npXt.transpose((28709, 48, 48, 1)).reshape(np.prod(npXt.shape[:2]),-1)
但是给出这个错误。
AxisError Traceback (most recent call last)
<ipython-input-8-2682876229f4> in <module>()
----> 1 npXt.transpose((28709, 48, 48, 1)).reshape(np.prod(npXt.shape[:2]),-1)
AxisError: axis 28709 is out of bounds for array of dimension 4
我做错了什么?
感谢您对此的任何帮助
更新: 感谢您的所有建议: 我试过了,有这样的错误:
ValueError: bad input shape (28709, 7)
所以这就是我要解决的问题。我认为问题在于我目前没有重塑阵列。 所以我像这样下载数据并且工作正常:
x_train, y_train, x_test, y_test = aiu.getKaggleData(file,numClass)
结果如下:
Creating Testing and Training datasets
Filling datasets
Transforming data to fit model's needs
Normalizing traing/testing datasets
Reshaping data
28709 train samples
3589 test samples
我希望这个和这个可以与我构建的另一个模型一起使用。 接下来我像这样构建 SVM 模型:
clf = SVC(C=0.01, kernel='linear', decision_function_shape='ovo', probability=True)
然后像这样把train和test数据转换成np数组
#Train data
npXt = np.array(x_train)
npYt = np.array(y_train)
#Eval test data
npXT = np.array(x_test)
npYT = np.array(y_test)
然后使用建议的内容
my_array = np.ones((28709, 48, 48, 1))
newXTrain = np.transpose( my_array ).reshape(np.prod(npXt.shape[:2]),-1)
print(newXTrain.shape)
print(npYt.shape)
这给了我这个:
(1378032, 48) #for data
(28709, 7) #for lables
然后我尝试像这样训练模型
clf.fit(newXTrain,npYt)
这给了我这个
raise ValueError("bad input shape {0}".format(shape))
ValueError: bad input shape (28709, 7)
感谢您迄今为止的所有帮助
我什至试过了,但仍然报错:
newXTrain = np.transpose( my_array ).reshape(np.prod(npXt.shape[:1]),-1)
这让我看起来很有希望。
(28709, 2304)
(28709, 7)
但给出了与 ValueError: bad input shape (28709, 7)
我认为这是您使用转置的方式。应该作为参数传递的应该是位置列表,在您的情况下是 0 到 3 之间的整数。
我猜你正在尝试反转 npXt 的索引,所以也许应该将 (3,2,1,0) 代替 (28709,48,48,1) 作为转置函数的参数。
我不明白你为什么在重塑之前转置数组 但是你使用的转置方式不对。
应该是:
my_array = np.ones((28709, 48, 48, 1))
np.transpose( my_array ).reshape(np.prod(npXt.shape[:2]),-1)
如果您将元组传递给转置函数,它会将其解释为矩阵轴索引的新顺序。因此转置轴号 28709 在这里没有意义。
如果你想重塑你可能根本不需要转置