使用
>>> a.shape
(207, 155, 3)这个numpy代码对numpy数组a做了什么?
a = a.T.reshape(self.channels,-1).reshape(-1)发布于 2014-02-28 12:38:14
>>> a.shape
(207, 155, 3)我将假设a表示一幅大小为155×207像素的图像,每个像素有3个彩色通道:
>>> height, width, channels = a.shape(请注意,这里我假设第一个轴是垂直的,第二个轴是水平的:请参见"多维数组索引顺序问题“以获得解释)。
>>> b = a.T
>>> b.shape
(3, 155, 207)a.T返回转置数组。但实际上它不会以任何方式改变图像数据。NumPy数组有两个部分:包含原始数值数据的数据缓冲区和描述如何索引数据缓冲区的视图。当您重塑或转置数组时,NumPy将数据缓冲区单独放在一边,并创建一个新的视图来描述对相同数据进行索引的新方法。(请看这里有更详细的解释。)
因此,a使用三个轴(y、x、c)对图像进行索引,而b使用相同的三个轴以相反的顺序(c、x、y)索引相同的图像:
>>> x, y, c = 100, 200, 1
>>> a[y, x, c] == b[c, x, y]
True第一次调用numpy.reshape
>>> c = b.reshape(3, -1)
>>> c.shape
(3, 32085)将最后两个索引压平为一个(第三个索引变化最快),因此c使用两个轴(c,x×height +y)对图像进行索引:
>>> a[y, x, c] == c[c, x * height + y]
True第二次重塑:
>>> d = c.reshape(-1)
>>> d.shape
(96255,)将剩下的两个索引压平为一个,以便d使用单轴((c×宽度)+ x)×高度+y对图像进行索引。
>>> a[y, x, c] == d[((c * width) + x) * height + y]
True请注意,使用numpy.flatten只需一步就可以完成整个操作
>>> (a.flatten(order='F') == d).all()
Truehttps://stackoverflow.com/questions/22093732
复制相似问题