【问题标题】:Numpy flatten RGB image arrayNumpy 展平 RGB 图像数组
【发布时间】:2016-08-26 08:40:00
【问题描述】:

我有 1,000 个 RGB 图像 (64X64),我想将它们转换为 (m, n) 数组。

我用这个:

import numpy as np
from skdata.mnist.views import OfficialImageClassification
from matplotlib import pyplot as plt
from PIL import Image                                                            
import glob
import cv2

x_data = np.array( [np.array(cv2.imread(imagePath[i])) for i in range(len(imagePath))] )
print x_data.shape

这给了我:(1000, 64, 64, 3)

现在如果我这样做:

pixels = x_data.flatten()
print pixels.shape

我得到:(12288000,)

但是,我需要一个具有以下维度的数组:(1000, 12288)

我怎样才能做到这一点?

【问题讨论】:

    标签: python arrays numpy image-processing


    【解决方案1】:

    在将flatten() 应用到展平数组后应用numpy 方法reshape()

      x_data = np.array( [np.array(cv2.imread(imagePath[i])) for i in range(len(imagePath))] )
    
      pixels = x_data.flatten().reshape(1000, 12288)
      print pixels.shape
    

    【讨论】:

    • 整洁!这会保留原始图像属性,即我不会丢失任何像素信息吗?
    • Flatten()reshape() 是无损的。结果数组的维度应始终相乘以得到相同的总数。 Flatten 有一个 shape() 作为一维数组,而不是 n 维数组,因此它的形状没有第二个值。它看起来像array([1, 2, 3,])。形状为 (3,1) 的 n-D 数组看起来像 array([[1],[2],[3]])
    • 这是一篇关于塑形的精彩 SO 帖子:stackoverflow.com/questions/22053050/…
    • @apples-oranges 也取决于你在做什么,你可能只想直接reshape 原始数据——扁平化创建你可能不需要的数据的重组副本。 x_data.reshape(1000, 12288)
    • 再次感谢您的提示!计划是通过 t-SNE 算法解析数组:-)。
    【解决方案2】:

    试试这个:

    d1, d2, d3, d4 = x_data.shape
    

    然后使用numpy.reshape()

    x_data_reshaped = x_data.reshape((d1, d2*d3*d4))
    

    x_data_reshaped = x_data.reshape((d1, -1))
    

    (Numpy 从原始长度和定义的维度d1 推断出值而不是-1

    【讨论】:

    • d2*d3*4 拼写更好-1。所以x_data_reshaped = x_data.reshape(x_data.shape[0], -1)
    • @Eric 你能解释一下 x_data.reshape((d1, d2*d3*4)) 和 x_data.reshape(x_data.shape[0], -1) 是如何相同的吗?
    【解决方案3】:

    您可以遍历图像数组并独立展平每一行。

    numImages = x_data.shape[0]
    flattened = np.array([x_data[i].flatten() for i in range(0,numImages)])
    

    【讨论】:

      【解决方案4】:

      你也可以这样使用: X 是您的 2D 图片,例如大小为 32x32,而 -1 仅表示它是一个未知维度,我们希望 numpy 弄清楚它。 numpy 将通过查看“数组长度和剩余维度”并确保它满足上述标准 (What does -1 mean in numpy reshape?) 来计算这一点。 T 表示在使用 axes 关键字参数时反转张量的转置 (https://docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html)。

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

      【讨论】:

      • 如果您对此进行详细说明会有所帮助,因为它可能会更好地帮助其他人理解您的解决方案。
      【解决方案5】:

      假设您有一个数组image_array,您可以使用reshape() 方法。

      image_array = image_array.reshape(1000, 12288)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-22
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 2011-12-07
        • 2020-12-21
        相关资源
        最近更新 更多