为什么在矩阵 X 上使用重塑函数时使用 (X.shape[0], -1) 作为参数?

Why (X.shape[0], -1) is used as parameters while using reshape function on a matrix X?

在学习 deeplearning.ai 课程时,我突然需要使用 numpy.reshape()。但是,在这样做的同时,课程笔记本中指示我以特定方式进行操作。 目的是将 4 维向量转换为 2 维向量。

// 说明:

为方便起见,您现在应该在形状 (num_px ∗∗ num_px ∗∗ 3, 1) 的 numpy 数组中重塑形状 (num_px、num_px、3) 的图像。在此之后,我们的训练(和测试)数据集是一个 numpy 数组,其中每一列代表一个扁平图像。应该有 m_train(分别为 m_test)列。

练习:重塑训练和测试数据集,以便将大小为 (num_px, num_px, 3) 的图像展平为形状为 (num_px ∗∗ num_px ∗∗ 3, 1).

的单个向量

当你想要将形状为 (a,b,c,d) 的矩阵 X 展平为形状为 (b∗∗c∗d, a) 的矩阵 X_flatten 时,一个技巧是使用:

X_flatten = X.reshape(X.shape[0], -1).T  


(X.T is the transpose of X)

我无法理解为什么要这样给出参数? 此外,在玩代码时,将“-1”更改为任何负整数,并没有改变输出。

我假设你正在使用 MNIST 数据集,所以你有 n 个大小为 mm3 的图像,让我们假设 n 为 100,m 为 8。所以你有 100 个大小为 8*8 的 RGB 图像(3 个通道),从而使您的数据形状为 100、8、8、3。现在您想要展平 100 张图像中的每一张,因此您可以循环遍历数据集,逐张展平它,或者您可以重塑它。

您决定通过以下方式重塑它:

X.reshape(X.shape[0], -1).T

让我们再解压一下,X.shape[0] 给你 100。shape 属性将 return 你一个 (100,8,8,3) 的元组,因为那是你的形状数据集,然后访问它的第 0 个元素,即 100,所以你得到

X.reshape(100, -1).T

那么它的作用是重塑数组但确保你仍然有 100 张图像,-1 表示你不关心结果将重塑成什么形状,所以它会自动推断从原始形状的形状。以前你有一个形状为 100、8、8、3 的 4 维数组,但现在你想将它重塑为一个二维数组,你指定 100 应该是形状的维度 0,所以 numpy 推断重塑它变成这样的二维形状,它必须将其展平,因此 100,883 是输出形状。

之后你只需转置它

此外,这就是 numpy 文档所说的

The new shape should be compatible with the original shape. If an integer, then the result will be a 1-D array of that length. One shape dimension can be -1. In this case, the value is inferred from the length of the array and remaining dimensions.