首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在张量中重新排列元素,比如在MATLAB中?

如何在张量中重新排列元素,比如在MATLAB中?
EN

Stack Overflow用户
提问于 2017-09-09 07:13:34
回答 1查看 1.4K关注 0票数 3

例如,我得到一个张量[30,6,6,3]:30是batch_size,6X6是height x width,3是channels)。

我如何将它的元素从3X3重新排列到1X9,就像MATLAB中的像素一样?如图所述:

tf.reshape()似乎行不通。

EN

回答 1

Stack Overflow用户

发布于 2017-09-09 18:42:10

您可以使用转置和整形的组合来完成这些类型的转换。numpy和TensorFlow逻辑是相同的,因此这里有一个使用Numpy的简单示例。假设您有4x4数组,并希望通过跳过行/列(如您的示例中所示),将其分解为4个子数组。

伊,从

代码语言:javascript
复制
a=array([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])

​您想要获得4个子图像,如

代码语言:javascript
复制
[0, 2]
[8, 10]

代码语言:javascript
复制
[1, 3]
[9, 11]

首先,您可以通过跨列来生成子数组。

代码语言:javascript
复制
b = a.reshape((4,2,2)).transpose([2,0,1])

这将生成以下数组

代码语言:javascript
复制
array([[[ 0,  2],
        [ 4,  6],
        [ 8, 10],
        [12, 14]],

       [[ 1,  3],
        [ 5,  7],
        [ 9, 11],
        [13, 15]]])

现在跳过行

代码语言:javascript
复制
c = b.reshape([2,2,2,2]).transpose(2,0,1,3)

这将生成以下数组

代码语言:javascript
复制
array([[[[ 0,  2],
         [ 8, 10]],

        [[ 1,  3],
         [ 9, 11]]],


       [[[ 4,  6],
         [12, 14]],

        [[ 5,  7],
         [13, 15]]]])

现在请注意,您有所需的子数组,但最左边的形状是2x2,但您希望有4个,所以您可以进行整形。

代码语言:javascript
复制
c.reshape([4,2,2])

这给了你

代码语言:javascript
复制
array([[[ 0,  2],
        [ 8, 10]],

       [[ 1,  3],
        [ 9, 11]],

       [[ 4,  6],
        [12, 14]],

       [[ 5,  7],
        [13, 15]]])

请注意,将n,m数组组合到n*m一维的一般技术是执行reshape(m*n, ...)。由于行的主要顺序,平坦的尺寸必须在左边,这样才能使整形作为扁平操作工作。因此,如果在您的例子中通道是最后一个维度,您将需要将它们转到左边,扁平(使用整形),然后将它们转回来。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46128117

复制
相关文章

相似问题

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