предположительно неверный вывод np.reshape - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть массив с именем "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]]

Как вы можете видетьверхний правый угол (который должен быть матрицей выше со всеми нулями), замененный различными значениями.Это только для того, чтобы доказать, что я действительно получаю разные значения, другие части матрицы также ложны.

Почему это происходит и как я могу это исправить?

С уважением.

1 Ответ

0 голосов
/ 04 декабря 2018

При использовании 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))
...