[Numpy-discussion] checking element types in array

2008-05-17 Thread Zoho Vignochi
hello:

I am writing my own version of a dot product. Simple enough this way:

def dot_r(a, b):
return sum( x*y for (x,y) in izip(a, b) )

However if both a and b are complex we need:

def dot_c(a, b):
return sum( x*y for (x,y) in izip(a.conjugate(), b) ).real

I would like to combine these so that I need only one function which 
detects which formula based on argument types. So I thought that 
something like:

def dot(a,b):
if isinstance(a.any(), complex) and isinstance(b.any(), complex): 
return sum( x*y for (x,y) in izip(a.conjugate(), b) ).real
else:
return sum( x*y for (x,y) in izip(a, b) )

And it doesn't work because I obviously have the syntax for checking 
element types incorrect. So my real question is: What is the best way to 
check if any of the elements in an array are complex?

Thank you, 

Zoho 

___
Numpy-discussion mailing list
Numpy-discussion@scipy.org
http://projects.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] checking element types in array

2008-05-17 Thread Anne Archibald
2008/5/17 Zoho Vignochi [EMAIL PROTECTED]:
 hello:

 I am writing my own version of a dot product. Simple enough this way:

 def dot_r(a, b):
return sum( x*y for (x,y) in izip(a, b) )

 However if both a and b are complex we need:

 def dot_c(a, b):
return sum( x*y for (x,y) in izip(a.conjugate(), b) ).real

As you probably realize, this will be vastly slower (ten to a hundred
times) than the built-in function dot() in numpy.

 I would like to combine these so that I need only one function which
 detects which formula based on argument types. So I thought that
 something like:

 def dot(a,b):
if isinstance(a.any(), complex) and isinstance(b.any(), complex):
return sum( x*y for (x,y) in izip(a.conjugate(), b) ).real
else:
return sum( x*y for (x,y) in izip(a, b) )

 And it doesn't work because I obviously have the syntax for checking
 element types incorrect. So my real question is: What is the best way to
 check if any of the elements in an array are complex?

numpy arrays are efficient, among other reasons, because they have
homogeneous types. So all the elements in an array are the same type.
(Yes, this means if you have an array of numbers only one of which
happens to be complex, you have to represent them all as complex
numbers whose imaginary part happens to be zero.) So if A is an array
A.dtype is the type of its elements.

numpy provides two convenience functions for checking whether an array
is complex, depending on what you want:

iscomplex checks whether each element has a nonzero imaginary part and
returns an array representing the element-by-element answer; so
any(iscomplex(A)) will be true if any element of A has a nonzero
imaginary part.

iscomplexobj checks whether the array has a complex data type. This is
much much faster, but of course it may happen that all the imaginary
parts happen to be zero; if you want to treat this array as real, you
must use iscomplex.

Anne


Anne
___
Numpy-discussion mailing list
Numpy-discussion@scipy.org
http://projects.scipy.org/mailman/listinfo/numpy-discussion