python

时间:2017-02-10 07:31:32

标签: python python-2.7 numpy transpose

我有一个补丁data,它的形状是(10,10,10)。我在python中使用转置函数

data.transpose(3, 0, 1, 2)

3, 0, 1, 2是什么意思。因为我得到了错误

ValueError: axes don't match array

我该怎么办?我正在使用python 2.7

8 个答案:

答案 0 :(得分:2)

该操作从(samplesrowscolumnschannels)转换为(sampleschannels,{{1} },rows),也许是opencv到pytorch。

答案 1 :(得分:1)

查看numpy.transpose

  

使用转置(a,argsort(axes))来反转张量的转置   当使用axes关键字参数时。

     

转置1-D数组会返回原始视图的未更改视图   阵列。

e.g。

>>> x = np.arange(4).reshape((2,2))
>>> x
array([[0, 1],
       [2, 3]])
>>>
>>> np.transpose(x)
array([[0, 2],
       [1, 3]])

答案 2 :(得分:1)

您在转置中指定了太多值

>>> a = np.arange(8).reshape(2,2,2)
>>> a.shape (2, 2, 2)
>>> a.transpose([2,0,1])
array([[[0, 2],
        [4, 6]],

       [[1, 3],
        [5, 7]]])
>>> a.transpose(3,0,1,2) Traceback (most recent call last):   File "<interactive input>", line 1, in <module> ValueError: axes don't match array
>>>

答案 3 :(得分:1)

np.transpose上的python文档中,np.transpose函数的第二个参数是axes,它是一个的int列表,可选         默认情况下,反转尺寸,否则置换轴         根据给出的值

示例:

>>> x = np.arange(9).reshape((3,3))
>>> x
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

>>> np.transpose(x, (0,1))
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

>>> np.transpose(x, (1,0))
array([[0, 3, 6],
       [1, 4, 7],
       [2, 5, 8]])

答案 4 :(得分:1)

让我根据Python3进行讨论。

我在python中将转置函数用作data.transpose(3, 0, 1, 2)

这是错误的,因为此操作需要4个维度,而您仅提供3个维度(如(10,10,10))。可复制为:

>>> a = np.arange(60).reshape((1,4,5,3))
>>> b = a.transpose((2,0,1))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: axes don't match array

如果图像批次为1,则可以通过将(10,10,10)重塑为(1,10,10,10)来简单地添加另一个尺寸。

w,h,c = original_image.shape #10,10,10
modified_img = np.reshape((1,w,h,c)) #(1,10,10,10)

3、0、1、2是什么意思。

对于二维numpy数组,数组(矩阵)的transpose的作用与名称相同。但是对于像您这样的高维数组,它基本上可以像moveaxis一样使用。

>>> a = np.arange(60).reshape((4,5,3))
>>> b = a.transpose((2,0,1))
>>> b.shape
(3, 4, 5)
>>> c = np.moveaxis(a,-1,0)
>>> c.shape
(3, 4, 5)
>>> b
array([[[ 0,  3,  6,  9, 12],
        [15, 18, 21, 24, 27],
        [30, 33, 36, 39, 42],
        [45, 48, 51, 54, 57]],

       [[ 1,  4,  7, 10, 13],
        [16, 19, 22, 25, 28],
        [31, 34, 37, 40, 43],
        [46, 49, 52, 55, 58]],

       [[ 2,  5,  8, 11, 14],
        [17, 20, 23, 26, 29],
        [32, 35, 38, 41, 44],
        [47, 50, 53, 56, 59]]])
>>> c
array([[[ 0,  3,  6,  9, 12],
        [15, 18, 21, 24, 27],
        [30, 33, 36, 39, 42],
        [45, 48, 51, 54, 57]],

       [[ 1,  4,  7, 10, 13],
        [16, 19, 22, 25, 28],
        [31, 34, 37, 40, 43],
        [46, 49, 52, 55, 58]],

       [[ 2,  5,  8, 11, 14],
        [17, 20, 23, 26, 29],
        [32, 35, 38, 41, 44],
        [47, 50, 53, 56, 59]]])

很明显,两种方法的工作原理相同。

答案 5 :(得分:0)

方法transpose接受数组作为参数,所以

data.transpose([3,0,1,2]) 

会奏效。参考:https://docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html

答案 6 :(得分:0)

问题是您已获取3维矩阵并应用了4维转置。 您的命令是将4d矩阵(批,行,行,通道)转换为另一个4d矩阵(行,行,通道,行),但是您需要一条命令来转换3d矩阵。因此删除3并写入 data.transpose(2, 0, 1)

答案 7 :(得分:0)

对于所有 i, j, k, l,以下内容均成立:

arr[i, j, k, l] == arr.transpose(3, 0, 1, 2)[l, i, j, k]

transpose(3, 0, 1, 2) 将数组维度从 (a, b, c, d) 重新排序为 (d, a, b, c)

>>> arr = np.zeros((10, 11, 12, 13))

>>> arr.transpose(3, 0, 1, 2).shape
(13, 10, 11, 12)