Numpy从np数组中删除维度

时间:2016-05-11 02:20:55

标签: python arrays numpy

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

只有两(2)个维度:

(106106)

和一个三(3)

(106,106,3)

有没有办法可以删除最后一个维度?

我试过np.delete,但它似乎没有用。

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

5 个答案:

答案 0 :(得分:43)

你可以使用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]也会提供所需的形状:这一切只取决于您需要保留的切片。

答案 1 :(得分:1)

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

Xtrain_monochrome = Xtrain.mean(axis=2)

答案 2 :(得分:1)

好吧,当您尝试缩小图像尺寸时应该小心。 图像通常是一个3-D矩阵,其中包含每个像素RGB值的数据。如果要将其缩小为二维,则实际上是将彩色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

答案 3 :(得分:0)

当数组的形状为(106, 106, 3)时,您可以将其可视化为具有 106行 106列的表格,其中每个点都填充有数据点是array of 3 numbers,我们可以表示为[x, y ,z]。因此,如果要获取维度(106, 106),则必须将表中的数据点设置为不是数组而是单个数字。您可以通过提取每个数据点的 x分量,y分量或z分量,或应用以某种方式汇总三个分量的函数来实现此目的,例如平均值,总和, max等。您可以提取任何组件,就像上面建议的@matt Messersmith。

答案 4 :(得分:0)

实际上,如果您两次应用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)