Ну, это немного запутанное решение, но я не знаю лучшего.
Просто чтобы продемонстрировать проблему, о которой вы говорите, людям, которые могут с ней не знакомы:
import numpy as np
import matplotlib.pyplot as plt
data = np.random.random((10,10))
data[[2, 5, 7], [5, 8, 1]] = np.nan
plt.imshow(data)
plt.show()

Размытие связано с тем, что matplotlib интерполирует альфа-значения (прозрачность). Изменение этого потребует настройки низкого уровня.
Однако, если вам не нужно показывать слой под изображением в областях без данных, вы можете сделать что-то вроде этого:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
# Generate some data...
data = np.random.random((10,10))
data[[2, 5, 7], [5, 8, 1]] = np.nan
# Convert it to a masked array instead of just using nan's..
data = np.ma.masked_invalid(data)
# Plot a version with the invalid data replaced with the mean...
plt.imshow(data.filled(data.mean()))
# Now plot a white (or whatever color you'd like), nearest-interpolated array
# over the invalid values...
bad_data = np.ma.masked_where(~data.mask, data.mask)
plt.imshow(bad_data, interpolation='nearest', cmap=mpl.cm.gray_r)
plt.show()

Если мы не построим исходные данные, используя «заполненную» версию (data.filled(data.mean())
), мы получим «ореолы» вокруг заблокированных недействительных значений:
