【问题标题】:How to convert 3D array to 2D in python?如何在python中将3D数组转换为2D?
【发布时间】:2020-03-13 19:08:26
【问题描述】:

我有一个包含 2890 个 tiff lzw 压缩图像的文件夹作为用于深度学习的标签(我有 2 个类,1 和 2)。我想将它们准备为需要二维数组的模型的输入。所以我使用skimage.io 库的imread() 将它们作为2890 个numpy 数组(Y)的列表读取,然后将列表转换为nd.array(Y_train)。现在我有 3 个维度(2890、224、224)的 Y_train,其中 224 ,224 是输入图像大小。 现在我需要将这个 3D 数组转换为 2D 数组,因为 (2890,2) 2 表示类号。

  1. 我使用了Y_train.reshape(2890,2),得到了这个错误:ValueError: cannot reshape array of size 145008640 into shape (2890,2).

  2. 我也使用了to_categorical 中的keras.utils 并得到了 4D 数组 (2890, 224, 224, 3)。

如何将 3D 数组 (2890, 224, 224) 转换为 2D 数组 (2890,2)?

【问题讨论】:

标签: python 3d 2d


【解决方案1】:

我认为你对重塑操作有一个非常错误的想法。整形操作确保矩阵/向量中的元素数量无论如何都相同。

因此,您只能将形状为 (A, B, C, D) 的矩阵重塑为 (A, E) iff B x C x D = E

您有两个完全不同的数组,形状为 (-1, 224, 224) 的 X 和形状为 (-1, 2) 的 Y。您不能只是重塑它们,您必须将图像读取为 numpy 数组,并且对于每个图像,将标签附加到另一个 numpy 数组,之后您可以应用 to_categorical (Keras) 或 LabelEncoder (scikit-learn)。

关注一些在线资源以了解阅读标签:Tensorflow read images with labels

【讨论】:

  • 这是我使用的代码:labels_path = "D:/01_thesis/data/qgis/01_classification/LABEL/"labels = glob.glob(labels_path + "*.tif") labels.sort()Y = []for mask in labels: label = imread(mask) Y.append(label) Y_train = np.asarray(Y)Y_train_categorical = keras.utils.to_categorical(Y_train)
  • 这似乎没问题,尽管这样很难阅读代码。有效吗?
  • 它正在工作,但最后我有一个 4D 数组,即 (2890, 224, 224, 3)。
  • 这是正确的维度。 2890 是您拥有的图像或样本的数量。 224 = 图像宽度,224 = 图像高度,3 = 图像通道(红、绿、蓝)
  • 我收到了这个错误:ValueError: Error when checking target: expected fc1000 to have 2 dimensions, but got array with shape (2312, 224, 224, 3) 2312 是将 2890 拆分为训练和测试的结果。
【解决方案2】:

假设您打算将其重塑为 (2890, 224*224),您可以通过在要替换旧尺寸的尺寸中添加 -1 来做到这一点。例如 np.reshape(2890, -1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 2012-12-01
    相关资源
    最近更新 更多