Per vedere che non si tratta solo di spostare i punti, basta disegnare una cornice attorno all'immagine: nella versione ruotata, l'immagine avrà i bordi diagonali e quindi non si adatta nemmeno alle dimensioni del immagine originale. 
 Quindi, per ruotarlo dovrai calcolare dove ogni pixel va. Nota che il punto in alto a sinistra   (0,1)    non finirà a   (1,1)    ma in un punto della diagonale la cui distanza dall'origine è   1   : vale a dire, a   (sqrt(2)/2, sqrt(2)/2)   . Poiché   sin(45) = cos(45) = sqrt(2)/2   , l'algoritmo che stai cercando è la moltiplicazione delle coordinate di ogni punto per questa matrice di trasformazione: 
|  sqrt(2)/2  sqrt(2)/2 |
| -sqrt(2)/2  sqrt(2)/2 |
 Guarda la pagina di Wikipedia su  Matrici di trasformazione  per i dettagli. Quindi, devi fare molte moltiplicazioni ma non devi calcolare  qualsiasi  seni o coseni (l'ho appena fatto per te dalla memoria). Puoi prendere altre scorciatoie, come suggerito dalle altre risposte, ma in un modo o nell'altro devi calcolare dove ogni pixel deve andare. 
 Ovviamente dovrai anche ritagliare o eseguire il pad per creare una normale immagine rettangolare. 
 PS. Meglio ancora, invece di implementare questa soluzione, affidarla a una libreria grafica che fa rotazioni. Oppure consulta  questa domanda SO  e la soluzione suggerita  nei commenti  sotto la domanda: 
  Consider scipy.ndimage.interpolation.shift() and rotate() or skimage.transform.fast_homography() for interpolated translations and rotations of 2D numpy arrays.