# doucmentation bug or bug? p or q for numerical arrays

Discussion in 'Python' started by Alan G Isaac, Jul 29, 2004.

1. ### Alan G IsaacGuest

from Numeric import *
p = array([1, 1, 0, 0])
q = array([1, 0, 1, 0])
print logical_or(p,q) #expected result
print (p or q) #prints p

This might be expected, except for the documentation:
http://numpy.sourceforge.net/numdoc/HTML/numdoc.htm#pgfId-36127

"Universal Functions, or ufunc s. The operators which invoke them when
applied to arrays are indicated in parentheses."

And then numarray has the same documentation (in the manual)
but chokes altogether on the use of 'or'.

There is a like problem with 'and'.

Are there actually operators for these functions?

Thanks,
Alan Isaac

PS A comment: operators are really useful here. Using the ufuncs
makes for very messy code. See the GAUSS programming
language for a nice syntax.

Alan G Isaac, Jul 29, 2004

2. ### Peter OttenGuest

Alan G Isaac wrote:

> from Numeric import *
> p = array([1, 1, 0, 0])
> q = array([1, 0, 1, 0])
> print logical_or(p,q) #expected result
> print (p or q) #prints p
>
> This might be expected, except for the documentation:
> http://numpy.sourceforge.net/numdoc/HTML/numdoc.htm#pgfId-36127
>
> "Universal Functions, or ufunc s. The operators which invoke them when
> applied to arrays are indicated in parentheses."
>
> And then numarray has the same documentation (in the manual)
> but chokes altogether on the use of 'or'.
>
> There is a like problem with 'and'.
>
> Are there actually operators for these functions?

Unlike '&', '|' and '~', the logical operators 'and' and 'or' cannot be
overridden, 'not' not in a useful manner (__nonzero__() must return an
integer). The documentation is probably wrong.

Peter

Peter Otten, Jul 29, 2004

3. ### Colin J. WilliamsGuest

Peter Otten wrote:
> Alan G Isaac wrote:
>
>
>>from Numeric import *
>>p = array([1, 1, 0, 0])
>>q = array([1, 0, 1, 0])
>>print logical_or(p,q) #expected result
>>print (p or q) #prints p
>>
>>This might be expected, except for the documentation:
>> http://numpy.sourceforge.net/numdoc/HTML/numdoc.htm#pgfId-36127
>>
>>"Universal Functions, or ufunc s. The operators which invoke them when
>>applied to arrays are indicated in parentheses."
>>
>>And then numarray has the same documentation (in the manual)
>>but chokes altogether on the use of 'or'.
>>
>>There is a like problem with 'and'.
>>
>>Are there actually operators for these functions?

>
>
> Unlike '&', '|' and '~', the logical operators 'and' and 'or' cannot be
> overridden, 'not' not in a useful manner (__nonzero__() must return an
> integer). The documentation is probably wrong.
>
> Peter
>

The not yet released version of PyMatrix, which subsclasses NumArray,
behaves as follows:

import PyMatrix.matrix as _m
p = _m.M([1, 1, 0, 0], type= _m._nt.Bool)
q = _m.M([1, 0, 1, 0], type= _m._nt.Bool)
print p ^ q # -> [[F T T F]]
print p & q # -> [[T F F F]]
print p | q # -> [[T T T F]]

Colin W.

Colin J. Williams, Jul 29, 2004
4. ### Terry ReedyGuest

"Peter Otten" <> wrote in message
news:cea2mh\$5u5\$04\$-online.com...
> Unlike '&', '|' and '~', the logical operators 'and' and 'or' cannot be
> overridden,

Which is because they are not actually operators in the strict sense (in
which 'a op b' is short for 'opfunc(a,b)'). Because of their
'short-circuiting' behavior, they are 'special forms' (in the Lisp sense)
that may not calculate b, whereas a function call always would. The
so-called ternary op is also special and also can not be directly written
as a function for the same reason.

Terry J. Reedy

Terry Reedy, Jul 30, 2004