Tengo un conjunto de imágenes representadas por un ndarray 3d. En resumen, lo que quiero hacer es eliminar una imagen completa si alguno de sus valores de píxel es un nan. Imagina que tenemos el siguiente ndarray:
a = np.arange(18).reshape(3, 2, 3) a = 1.0 * a a[0][0][1] = np.nan a[1][0][0] = np.nan a [[[ 0. nan 2.] [ 3. 4. 5.]] [[nan 7. 8.] [ 9. 10. 11.]] [[12. 13. 14.] [15. 16. 17.]]]Ahora lo que quiero obtener es una función que dado que ndarray devuelve True, True, False. Para finalmente usar np.delete.
He probado lo siguiente, que funciona:
np.delete(a, [np.isnan(image.flatten()).any() for image in a], axis=0) array([[[12., 13., 14.], [15., 16., 17.]]]))Sin embargo, me cuesta creer que no haya una función en numpy que sea más eficiente, y dado que tengo muchas imágenes, me gustaría optimizarla tanto como sea posible.
Como ya respondió Michael Szczesny, una forma más pitónica sería:
filtered_images=a[~np.isnan(a).any(axis=(2,1))]Si ese fragmento de código es difícil de entender, considere extraer cada imagen con un bucle for de la siguiente manera:
filtered_images=list() for value in a: if(np.isnan(value).any()!=True): filtered_images.append(value)¡Ambos enfoques deberían darte un resultado similar!