Изменение формы не меняет порядок данных. Попробуйте сначала сериализовать пространственные измерения, а затем транспонировать:
>>> by_channel = picture.reshape(-1, 3).transpose() # or .T for short
>>> by_channel.shape # Correct shape?
(3, 311040)
>>> np.all(by_channel[0] == picture[..., 0].ravel()) # Correct data?
True
Операция .transpose()
является собственной инверсией, поэтому для ее обратного преобразования просто выполните:
>>> _picture = by_channel.T.reshape(picture.shape)
>>> np.all(_picture == picture)
True