Python将np 4D阵列重新整形为2D阵列。Kaggle图像数据

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (126)

我正在尝试将4D数组转换为2D数组以使用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) 

然后将列车和测试数据转换成这样的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)

提问于
用户回答回答于

我不明白为什么你在重塑之前转置数组但是你使用错误的转置方式。

它应该是:

my_array = np.ones((28709, 48, 48, 1))
np.transpose( my_array ).reshape(np.prod(npXt.shape[:2]),-1)

如果将元组传递给转置函数,它会将其解释为矩阵轴索引的新顺序。因此,转换轴号28709在这里没有意义。

如果你想重塑,你可能根本不需要转置

用户回答回答于

我认为这是你使用转置的方式。应该作为参数传递的应该是一个位置列表,在你的情况下,整数在0和3之间。

我猜你试图反转npXt的索引,所以也许(3,2,1,0)应该代替(28709,48,48,1)作为转置函数的参数。

所属标签

可能回答问题的人

  • 西风

    renzha.net · 站长 (已认证)

    7 粉丝1 提问9 回答
  • 四无君

    0 粉丝0 提问3 回答
  • 拉布拉多拉不多

    1 粉丝0 提问2 回答
  • HKC

    红客学院 · 创始人 (已认证)

    26 粉丝7 提问2 回答

扫码关注云+社区

领取腾讯云代金券