【问题标题】:Numpy remove a dimension from np arrayNumpy 从 np 数组中删除一个维度
【发布时间】:2016-09-06 05:29:26
【问题描述】:

我有一些我想要处理的图像,问题是有两种图像都是 106 x 106 像素,一些是彩色的,一些是黑白的。

只有两 (2) 个维度:

(106,106)

一加三 (3)

(106,106,3)

有没有办法可以去掉最后一个维度?

我尝试了 np.delete,但它似乎不起作用。

np.shape(np.delete(Xtrain[0], [2] , 2))
Out[67]: (106, 106, 2)

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    您可以使用 numpy 的精美索引(Python 内置切片表示法的扩展):

    x = np.zeros( (106, 106, 3) )
    result = x[:, :, 0]
    print(result.shape)
    

    打印

    (106, 106)
    

    (106, 106, 3) 的形状意味着您有 3 组具有(106, 106) 形状的事物。因此,为了“剥离”最后一个维度,您只需选择其中一个(这就是花哨的索引所做的)。

    你可以保留任何你想要的切片。我随意选择保留第 0 个,因为你没有指定你想要什么。因此,result = x[:, :, 1]result = x[:, :, 2] 也会给出所需的形状:这完全取决于您需要保留哪个切片。

    【讨论】:

    • '形状为 (106, 106, 3) 意味着您有 3 组具有形状 (106, 106) 的事物'。如果你看到这样的数组:(3, 106, 106),你会说它是什么样的?
    • 你怎么知道它没有说有 106 个东西,即 106 x 3?
    • 一般来说你不知道,但我认为这个具体问题(有点)清楚。例如,OP 似乎暗示他关心保持 (106, 106) 形状
    • 仅供参考,这看起来像是从三项集中的第一项。有没有一种很好的方法来取中位数或平均值?
    • 请注意这将返回一个视图,而不是一个副本。这意味着您应用于新数组的更改也将反映在旧数组中。
    【解决方案2】:

    只取颜色维度上的平均值 (axis=2):

    Xtrain_monochrome = Xtrain.mean(axis=2)
    

    【讨论】:

      【解决方案3】:

      当您的数组的形状为(106, 106, 3) 时,您可以将其可视化为具有106 行106 列 的表格,其中填充了每个点为@ 的数据点987654322@,我们可以表示为[x, y ,z]。因此,如果要获取维度(106, 106),则必须使表中的数据点不是数组而是单个数字。您可以通过提取每个数据点的 x 分量、y 分量或 z 分量 或通过应用以某种方式聚合三个分量的函数(如 mean、sum、 max 等。 您可以像上面建议的 @matt Messersmith 一样提取任何组件。

      【讨论】:

        【解决方案4】:

        好吧,当您尝试减小图像的尺寸时应该小心。 图像通常是包含每个像素的 RGB 值数据的 3-D 矩阵。如果您想将其缩小为 2-D,您真正要做的是将彩色 RGB 图像转换为灰度图像。

        并且有几种方法可以做到这一点,例如您可以取最大值三个、最小值、平均值、总和等,具体取决于您想要的图像精度。您可以做的最好的事情是使用公式对 RGB 值进行加权平均

        Y = 0.299R + 0.587G + 0.114B

        其中 R 代表红色,G 代表绿色,B 代表蓝色。在 numpy 中,这可以写成

        new_image = img[:, :, 0]*0.299 + img[:, :, 1]*0.587 + img[:, :, 2]*0.114
        

        【讨论】:

          【解决方案5】:

          实际上np.delete 可以应用两次, 例如,如果您想保留第一个频道,则可以运行以下命令:

          Xtrain = np.delete(Xtrain,2,2) # this will get rid of the 3rd component of the 3 dimensions
          print(Xtrain.shape) # will now output (106,106,2)
          # again we apply np.delete but on the second component of the 3rd dimension
          Xtrain = np.delete(Xtrain,1,2)
          print(Xtrain.shape) # will now output (106,106,1)
          # you may finally squeeze your output to get a 2d array
          Xtrain = Xtrain.squeeze()
          print(Xtrain.shape) # will now output (106,106)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-06-08
            • 1970-01-01
            • 2016-04-20
            • 1970-01-01
            • 1970-01-01
            • 2011-03-10
            • 2018-11-16
            • 2020-10-19
            相关资源
            最近更新 更多