首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nparray.T.reshape(x,-1).reshape(-1):这对nparray有什么影响?

nparray.T.reshape(x,-1).reshape(-1):这对nparray有什么影响?
EN

Stack Overflow用户
提问于 2014-02-28 11:20:21
回答 1查看 5K关注 0票数 0

使用

代码语言:javascript
复制
>>> a.shape
(207, 155, 3)

这个numpy代码对numpy数组a做了什么?

代码语言:javascript
复制
a = a.T.reshape(self.channels,-1).reshape(-1)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-28 12:38:14

代码语言:javascript
复制
>>> a.shape
(207, 155, 3)

我将假设a表示一幅大小为155×207像素的图像,每个像素有3个彩色通道:

代码语言:javascript
复制
>>> height, width, channels = a.shape

(请注意,这里我假设第一个轴是垂直的,第二个轴是水平的:请参见"多维数组索引顺序问题“以获得解释)。

代码语言:javascript
复制
>>> b = a.T
>>> b.shape
(3, 155, 207)

a.T返回转置数组。但实际上它不会以任何方式改变图像数据。NumPy数组有两个部分:包含原始数值数据的数据缓冲区和描述如何索引数据缓冲区的视图。当您重塑或转置数组时,NumPy将数据缓冲区单独放在一边,并创建一个新的视图来描述对相同数据进行索引的新方法。(请看这里有更详细的解释。)

因此,a使用三个轴(y、x、c)对图像进行索引,而b使用相同的三个轴以相反的顺序(c、x、y)索引相同的图像:

代码语言:javascript
复制
>>> x, y, c = 100, 200, 1
>>> a[y, x, c] == b[c, x, y]
True

第一次调用numpy.reshape

代码语言:javascript
复制
>>> c = b.reshape(3, -1)
>>> c.shape
(3, 32085)

将最后两个索引压平为一个(第三个索引变化最快),因此c使用两个轴(c,x×height +y)对图像进行索引:

代码语言:javascript
复制
>>> a[y, x, c] == c[c, x * height + y]
True

第二次重塑:

代码语言:javascript
复制
>>> d = c.reshape(-1)
>>> d.shape
(96255,)

将剩下的两个索引压平为一个,以便d使用单轴((c×宽度)+ x)×高度+y对图像进行索引。

代码语言:javascript
复制
>>> a[y, x, c] == d[((c * width) + x) * height + y]
True

请注意,使用numpy.flatten只需一步就可以完成整个操作

代码语言:javascript
复制
>>> (a.flatten(order='F') == d).all()
True
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22093732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档