question about imshow's support for masked arrays

I am experimenting with numpy masked arrays, and have a question about how imshow handles them:

from numpy import ma
from pylab import colorbar, imshow, show

a=ma.array([[1,2,3],[4,5,6]],mask=[[0,0,1],[0,0,0]], fill_value=0)
imshow(a, interpolation=‘nearest’)
colorbar()
show()

With svn matplotlib, the missing value is treated as if identical to the maximum value. I thought imshow would instead respect the masked array’s fill_value property by calling fix_invalid, and perhaps defaulting to the min() or max() if fill_value is the default 999999. What is the intended behavior?

Relatedly, it looks like imshow and other functions like contour are badly confused by NaNs, I thought they were supported?

Thanks,
Darren

Darren Dale wrote:

I am experimenting with numpy masked arrays, and have a question about how imshow handles them:

from numpy import ma
from pylab import colorbar, imshow, show

a=ma.array([[1,2,3],[4,5,6]],mask=[[0,0,1],[0,0,0]], fill_value=0)
imshow(a, interpolation='nearest')
colorbar()
show()

With svn matplotlib, the missing value is treated as if identical to the maximum value. I thought imshow would instead respect the masked array's

I don't see this with my installation from svn.

fill_value property by calling fix_invalid, and perhaps defaulting to the min() or max() if fill_value is the default 999999. What is the intended behavior?

What I see with your example is a white square for the masked value; actually, it is transparent, with alpha = 0. This is the intended default; if it is masked, don't paint anything. It is set in Colormap.__init__ and can be overridden by Colormap.set_bad().

There is no intention to use the masked array fill value.

Relatedly, it looks like imshow and other functions like contour are badly confused by NaNs, I thought they were supported?

I suspect we really should run the Z inputs through masked_invalid, especially for contour. The performance hit is minimal as a fraction of the total time. I will do this for contour. imshow has to be handled more carefully, so I don't want to do it in a hurry.

One of the general cleanups needed in mpl is clarity and consistency in argument validation. Part of this is a matter of clarity about API levels; we don't want to have to do full validation and acceptance of all possible input variations at every level.

Eric

···

Thanks,
Darren

Darren Dale wrote:

I am experimenting with numpy masked arrays, and have a question about how imshow handles them:

from numpy import ma

from pylab import colorbar, imshow, show

a=ma.array([[1,2,3],[4,5,6]],mask=[[0,0,1],[0,0,0]], fill_value=0)

imshow(a, interpolation=‘nearest’)

colorbar()

show()

With svn matplotlib, the missing value is treated as if identical to the maximum value. I thought imshow would instead respect the masked array’s

I don’t see this with my installation from svn.

fill_value property by calling fix_invalid, and perhaps defaulting to the min() or max() if fill_value is the default 999999. What is the intended behavior?

What I see with your example is a white square for the masked value; actually, it is transparent, with alpha = 0. This is the intended default; if it is masked, don’t paint anything. It is set in Colormap.init and can be overridden by Colormap.set_bad().

I was using a greyscale colormap that painted the max value white, and I confused no paint with max value. Personally, I think black would have been a better default, but no matter. Thank you for the clarification.

There is no intention to use the masked array fill value.

Relatedly, it looks like imshow and other functions like contour are badly confused by NaNs, I thought they were supported?

I suspect we really should run the Z inputs through masked_invalid, especially for contour. The performance hit is minimal as a fraction of the total time. I will do this for contour. imshow has to be handled more carefully, so I don’t want to do it in a hurry.

Ok.

Darren

···

On Wed, Mar 25, 2009 at 3:02 PM, Eric Firing <efiring@…552…229…> wrote: