据推测是错误的输出np.reshape

时间:2018-12-04 15:24:50

标签: python python-3.x matrix reshape

我有一个名为 形状为(16,16,8,8)的“ foto_dct”表示16x16矩阵为8x8。

当我打印foto_dct [0,15]时,我得到第一行的最后一个矩阵:

array([[0, 0, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0]])

当我做foto_dct_big = np.reshape(foto_dct,(128,128)) 并打印foto_dct_big我得到了:

[[  0   0   0 ...  49 148 245]
 [  0  16   0 ...  10   0   3]
 [  1   4   3 ... 148 137 128]
 ...
 [  0   0   0 ...   0   0   0]
 [  0   0   0 ...   0   0   0]
 [  0   0   0 ...   0   0   0]]

您可以看到用不同的值替换了右上角(应该是上面带有所有零的矩阵)。 这只是为了证明我确实得到了不同的值,矩阵的其他部分也为假。

为什么会这样,我该如何解决?

亲切的问候。

1 个答案:

答案 0 :(得分:0)

使用整形时,尺寸顺序很重要,因为它决定了矩阵元素的读取方式。根据{{​​3}}中的指定,默认情况下,最后一个维度是最快的那个,然后是倒数第二个,依此类推。因此,在您进行重塑时,将首先读取两个8x8,并将其重塑为128x128矩阵的一行。为了以正确的顺序进行读取,您首先必须交换尺寸,以使与行相关的尺寸(即8x8矩阵的行和16x16矩阵的行)与列相同。您可以使用documentation来做到这一点。

我还没有测试过,但是我相信这应该可以工作

a = np.transpose(a, (0, 2, 1, 3)) # The new shape is (16, 8, 16, 8)
a = np.reshape(a, (128, 128))