File: ieeespecial.py

package info (click to toggle)
python-numarray 1.1.1-3
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 7,428 kB
  • ctags: 8,469
  • sloc: ansic: 92,018; python: 20,861; makefile: 263; sh: 13
file content (132 lines) | stat: -rw-r--r-- 3,882 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
""" This module provides access to higher level functions and
constants for ieee special values such as Not a Number (nan) and
infinity (inf).

>>> from numarray import *

>>> inf    # the repr() of inf may vary from platform to platform
inf
>>> nan    # the repr() of nan may vary from platform to platform
nan

# Create a couple inf values in 4,4 array

>>> a=arange(16.0, shape=(4,4))
>>> a[2,3] = 0.0
>>> b = 1/a
Warning: Encountered divide by zero(s)  in divide

# Locate the positions of the inf values

>>> getinf(b)
(array([0, 2]), array([0, 3]))

# Change the inf values to something else

>>> a[getinf(b)] = 999
>>> a
array([[ 999.,    1.,    2.,    3.],
       [   4.,    5.,    6.,    7.],
       [   8.,    9.,   10.,  999.],
       [  12.,   13.,   14.,   15.]])

# Set a bunch of locations to a special value

>>> a[0,1] = nan; a[1,2] = nan; a[2,3] = nan
>>> getnan(a)
(array([0, 1, 2]), array([1, 2, 3]))
"""

import numarrayall as _na
import ieeespecial as _spec

# Define *ieee special values*
_na.Error.pushMode(all="ignore")
plus_inf = inf = _na.array(1.0)/_na.array(0.0)
minus_inf = _na.array(-1.0)/_na.array(0.0)    
nan = _na.array(0.0)/_na.array(0.0)
_na.Error.popMode()

# Define *mask condition bits*
def BIT(x):
    return _na.array([(1 << x)], type=_na.Int32)

POS_QUIET_NAN     = BIT(0)
NEG_QUIET_NAN     = BIT(1)
POS_SIGNAL_NAN    = BIT(2)
NEG_SIGNAL_NAN    = BIT(3)
POS_INFINITY      = BIT(4)
NEG_INFINITY      = BIT(5)
POS_DENORMALIZED  = BIT(6)
NEG_DENORMALIZED  = BIT(7)
POS_NORMALIZED    = BIT(8)
NEG_NORMALIZED    = BIT(9)
POS_ZERO          = BIT(10)
NEG_ZERO          = BIT(11)
INDETERM          = BIT(12)
BUG               = BIT(15)

NAN = POS_QUIET_NAN | NEG_QUIET_NAN | POS_SIGNAL_NAN | NEG_SIGNAL_NAN | INDETERM
INFINITY = POS_INFINITY | NEG_INFINITY
SPECIAL = NAN | INFINITY

NORMALIZED = POS_NORMALIZED | NEG_NORMALIZED
DENORMALIZED = POS_DENORMALIZED | NEG_DENORMALIZED
ZERO = POS_ZERO | NEG_ZERO
NUMBER = NORMALIZED | DENORMALIZED | ZERO

def mask(a, m):
    """mask(a, m) returns the values of 'a' satisfying category 'm'.
    mask does a parallel check for values which are not classifyable
    by the categorization code, raising a RuntimeError exception if
    any are found.
    """
    a = _na.asarray(a)
    if isinstance(a.type(), _na.IntegralType):
        raise TypeError("Integer arrays can't represent IEEE special values.")
    f = _na.ieeemask(a, m)
    g = _na.ravel(_na.ieeemask(a, BUG))
    if _na.bitwise_or.reduce(g) != 0:
        raise RuntimeError("Unclassifyable floating point values.")
    return f

def index(a, msk):
    """index returns the tuple of indices where the values satisfy 'mask'"""
    return _na.nonzero(mask(a, msk))

def getinf(a):
    """getinf returns a tuple of indices of 'a' where the values are infinite."""
    return _spec.index(a, _spec.INFINITY)

def setinf(a, value):
    """setinf sets elements of 'a' which are infinite to 'value' instead.
    DEPRECATED:  use 'a[getinf(a)] = value'  instead.
    """
    _na.put(a, getinf(a), value)

def getposinf(a):
    """getposinf returns a tuple of indices of 'a' where the values are +inf."""
    return _spec.index(a, _spec.POS_INFINITY)

def getneginf(a):
    """getneginf returns a tuple of indices of 'a' where the values are -inf."""
    return _spec.index(a, _spec.NEG_INFINITY)

def getnan(a):
    """getnan returns a tuple of indices of 'a' where the values are not-a-numbers"""
    return _spec.index(a, _spec.NAN)

def setnan(a, value):
    """setnan sets elements of 'a' which are NANs to 'value' instead.
    DEPRECATED:  use 'a[getnan(a)] = value'  instead.
    """
    _na.put(a, getnan(a), value)

def getbug(a):
    """getbug returns a tuple of indices of 'a' where the values are not classifyable."""
    return _spec.index(a, _spec.BUG)

def test():
    import doctest, ieeespecial
    return doctest.testmod(ieeespecial)