【问题标题】:supposedly incorrect output np.reshape function据称不正确的输出 np.reshape 函数
【发布时间】:2018-12-04 15:24:50
【问题描述】:

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

当我打印 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]]

如您所见,右上角(应该是上面所有零的矩阵)被替换为不同的值。 这只是为了证明我确实得到了不同的值,矩阵的其他部分也是错误的。

为什么会发生这种情况,我该如何解决?

亲切的问候。

【问题讨论】:

    标签: python python-3.x matrix reshape


    【解决方案1】:

    使用 reshape 时,维度的顺序很重要,因为它决定了矩阵元素的读取方式。正如documentation 中指定的那样,默认情况下,最后一个维度是最快的维度,然后是倒数第二个维度,依此类推。因此,在您进行重塑时,将首先读取两个 8x8 并将其重塑为 128x128 矩阵的一行。为了以正确的顺序进行读取,您首先必须交换维度以使与行相关的维度(即 8x8 矩阵的行和 16x16 矩阵的行)与列相同。您可以使用np.transpose 来执行此操作。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多