Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Python
branch: master

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
arrayobj.py
dim.py
info.py
readme.txt

readme.txt

ValueArray object
=================

The purpose of the ValueArray object is to not only have an n-dimensional array
of data but also to encode information about what a certain axis corresponds to.
For example one axis could represent a time or frequency dimension or perhaps 
repeated measurements, two of the dimensions could be matrix dimensions.

To encode this information a new tuple has been added along the regular shape tuple. 
In this implementation we call the attribute storing this tuple *info*. Each element 
in the info tuple is an instance of a Dim class, the Dim object contains the name,
data, unit and outputformat (format string to store format string for default
formatting of the data).

The Dim object is supposed to be frozen so it can be used as a dictionary key.

Dim object
==========

ValueArray on a Dim object produces a ValueArray with info=(Dim,) and with the data from
the Dim
  >>> fi = DimSweep("f", [10, 20, 30])
  >>> a = ValueArray(fi)
  >>> a.info
  (DimSweep("f", shape=(3,)),)
  >>> a
  ValueArray([10, 20, 30])



Broadcasting
============

ValueArray objects can not be combined with regular array even if the shapes match.

The resulting shape of a broadcast between ValueArrays is determined by the union of the
info tuples, i.e. the dimensions in each array are rearranged so that the info tuples match
with size=1 dimensions where for missing Dims.

  >>> fi = DimSweep("f", [10, 20, 30])
  >>> gi = DimSweep("g", [100, 200, 300, 400])
  >>> hi = DimSweep("h", [1, 2])

  >>> a = ValueArray(zeros((3, 2)), info=(fi, hi))
  >>> b = ValueArray(zeros((2,)), info=(hi,))
  >>> c = ValueArray(zeros((3,)), info=(fi,))

  >>> (a + b).info
  (DimSweep('f', shape=(3,)), DimSweep('h', shape=(2,)))
  >>> (a + c).info
  (DimSweep('f', shape=(3,)), DimSweep('h', shape=(2,)))
  
  
This broadcasting method means that you can apply a reducing method as mean to any axis
and still be able to do meaningful operations against the original array without having to 
manually add a newaxis at the correct position.
  
However I do not want to require that the data portion of the Dim objects match only the names.
Other wise it would be very annoying to do operations like diff where we have taken unequal
subsets of arrays to do a computation e.g. a[1:] - a[:-1]. In cases like this the Dim object of
the first object is used in the result.



Indexing
========

indexing by boolean arrays have been extended so that a single dimensional array does not operate on the 
first dimension of the array but rather on the dimension with a matching Dim.

    >>> FG = ValueArray(fi) + ValueArray(gi)
    ValueArray([[110, 210, 310, 410],
           [120, 220, 320, 420],
           [130, 230, 330, 430]])
       
    >>> FG[ValueArray(fi) > 10]
    ValueArray([[120, 220, 320, 420],
           [130, 230, 330, 430]])

    >>> FG[ValueArray(gi) > 10]
    ValueArray([[310, 410],
           [320, 420],
           [330, 430]])


Array methods over axis
=======================
All array methods with an axis argument should be able to take dim objects instead of an axis index. Thus simplifying
dynamic code. You could also for instance match against the actual class of the Dim object to apply operations over 
the same kind of dimensions.

My usecase here is when doing post processing of measurement data I often have different number of repeated measurements 
for different objects::

	fi = DimSweep("freq", [10, 20, 30])
	ra = DimRep("repa", [1, 2, 3])
	rb = DimRep("repb", [1, 2, 3, 4, 5])
	obja = ValueArray(..., info=(fi, ra,))	
	objb = ValueArray(..., info=(fi, rb,))
	
	rawresult = obja - objb
	
	result = rawresult.mean(DimRep)
	s_result = rawresult.std(DimRep)
	
Here we get the mean over all repeat dimensions but leave other dimensions alone	
Something went wrong with that request. Please try again.