[Numpy-discussion] numarray: need Float32 abs from array of type na.Complex64 or na.Complex32

Todd Miller jmiller at stsci.edu
Thu Mar 2 07:14:03 CST 2006


Sebastian Haase wrote:
> Hi,
> I just was hunting a very strange bug: I got weird results .... anyway.
>
> I found that I was using this line of code:
> if img.type() in (na.Complex64, na.Complex32):
>      img = abs(na.asarray(img, na.Float32))
>
> Now I don't understand how this code worked at all ? But I only saw those 
> "weird results" after looking at the "dimmest corners" in my image and 
> otherwise all images looked O.K.
>
> The goal here was to get a single precision absolute for either a complex64 or 
> complex32 valued image array WITHOUT creating a temporary array.
>   
This idea sounds inconsistent to me.  If the array is Complex64 and you 
pass it into asarray(,Float32),  you're going to get a temporary.   AND 
you're also truncating the imaginary part as you downcast to Float32... 
you're not getting a complex magnitude.

Since abs() transforms from complex to real,  you're going to get a 
temporary unless  you get a little fancy,  maybe like this:

na.abs(img, img.real)   # stores the abs() into the real component of 
the original array.  img.real is a view not a copy.
img.imag = 0               # optional step which makes the complex img 
array a real valued array with complex storage.
img = img.real             # just forget that img is using complex 
storage. 

Note that img is now discontiguous since no copy was made and there are 
still interleaved 0-valued imaginary components.   So,  I think there 
are two points to avoiding a copy here: (1) use the optional ufunc 
output parameter  (2) store the abs() result into the .real view of the 
original complex array.
> My thinking was that:
> img = na.abs( na.asarray(img, na.Complex32) ) 
> would create a complete temporary version of img starts out being Complex64
> Is this really the case ?
>   
Yes.






More information about the Numpy-discussion mailing list