python - 据称不正确的输出 np.reshape 函数
问题描述
我有一个名为“foto_dct”的数组,其形状为 (16,16,8,8),这意味着 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]]
如您所见,右上角(应该是上面所有零的矩阵)被替换为不同的值。这只是为了证明我确实得到了不同的值,矩阵的其他部分也是错误的。
为什么会发生这种情况,我该如何解决?
亲切的问候。
解决方案
使用 reshape 时,维度的顺序很重要,因为它决定了矩阵元素的读取方式。如文档中所述,默认情况下,最后一个维度是最快的维度,然后是倒数第二个维度,依此类推。因此,在您进行整形时,将首先读取两个 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))
推荐阅读
- c++ - 在 C++ 中编码解码的 url
- excel - 如何通过条件VBA从范围中选择一个随机值
- flutter - 如何正确填充具有点击效果的 IconButton?
- javascript - 如何模拟节点readline?
- javascript - 单击AJAX时如何显示所选选项标签的值
- spring-boot - Spring Lemon:缺少响应标头 Set-Cookie 和 X-XSRF-TOKEN
- rust - 如何向编译器传达借用仅发生在枚举的一半中
- excel - 用于在 sheet2 中搜索现有数据的 Excle VBA 代码
- spring - Spring Security:authorizeRequests().antMatchers().permitAll() 不起作用
- dialogflow-es - 如何通过 actions-for-google/google 助手集成为对话流提供时区?