The @Dietrich answer is valid, however in some cases it will flip the image. Since the transpose operator reverses the index, if the image is stored in RGB x rows x cols the transpose operator will yield cols x rows x RGB (which is the rotated image and not the desired result).
>>> arr = np.random.uniform(size=(3,256,257))*255
Note the 257 for visualization purposes.
>>> arr.T.shape
(257, 256, 3)
>>> arr.transpose(1, 2, 0).shape
(256, 257, 3)
The last one is what you might want in some cases, since it reorders the image (rows x cols x RGB in the example) instead of fully transpose it.
>>> arr = np.random.uniform(size=(3,256,256))*255
>>> arr = np.ascontiguousarray(arr.transpose(1,2,0))
>>> img = Image.fromarray(arr, 'RGB')
>>> img.save('out.png')
Probably the cast to contiguous array is not even needed, but is better to be sure that the image is contiguous before saving it.
np.swapaxesto reshape to a(256,256,3)array?Image.fromarray(np.uint8(arr), 'RGB')