Take the 2-minute tour ×

I'm fairly new to python and I am currently making use of the numPy library along with pyinterval library. I want to build a matrix that isn't composed of floats, but intervals.

however if I do the following:

A = [[interval([2,3]), interval([0,1]), interval([1,2]), interval([2,3])]]
m = np.matrix(A,interval)

it gives the following error:

raise ValueError, "matrix must be 2-dimensional"

In order to see how it was doing it I looked at this:


and got the following output:

array([[[[ 2.,  3.]],
    [[ 0.,  1.]],
    [[ 1.,  2.]],
    [[ 2.,  3.]]]])

when I wanted to see something like:

array([[interval(2,3), interval[0,1],
       [interval(1,2), interval[2,3]])

I'm not sure how to get it to understand the type that I am using, I have tried various things after doing some searches but nothing seems to work.

How can I get it to see one interval as only one element in the array/matrix?

Thank you,

share|improve this question

1 Answer 1

up vote 3 down vote accepted

From the docs regarding dtype syntax:

each type specifier can be prefixed with a repetition number, or a shape. In these cases an array element is created, i.e., an array within a record. That array is still referred to as a single field.

So to specify it as one item in the array, you might try setting the dtype to '(2,)object':

To make a 2x2 ndarray:

import interval
A = [(interval.interval([2,3]), interval.interval([0,1])),
     (interval.interval([1,2]), interval.interval([2,3]))]
a = np.array(A,dtype='(2,)object')

To make a 2x2 matrix:


Warning: I don't really understand dtype syntax. It is far too complicated and occasionally I see strange bug reports (#1955,#1760, #1580) related to use of exotic dtypes. My personal conclusion is that it is safer to stick to plain, simple dtypes. Or, if you need to use a more complicated dtype, unit test it to make sure it behaves as you expect.

An easier, better way to define the arrays is:

a = np.empty((2,2),dtype='object')

This tells numpy explicity what shape array you want, and then, since the dtype is object, you can stuff whatever you please into the cells of the array.

Moreover, unlike the dtype='(2,)object' solution above, it also works for 1D arrays:

bd = [interval.interval([0,1]),

b = np.empty(2,dtype='object')
share|improve this answer
thank you, that solved it –  user812352 Nov 26 '11 at 3:22
it still acts a little strangely: If i have the following code: bd = [interval([0,1]), interval([6,7])] b = np.array(bd,dtype='(2,)object') i get: array([[(0.0, 1.0), (0.0, 1.0)], [(6.0, 7.0), (6.0, 7.0)]], dtype=object) rather than array([[interval(0.0, 1.0)], [(6.0, 7.0)]], dtype=object) do you know why this is? –  user812352 Nov 26 '11 at 16:56
Good point. It finally dawned on me there is an easier way to define the arrays without messing with dtype. I've edited the post to show what I mean. –  unutbu Nov 26 '11 at 19:17
thanks, this is a lot better –  user812352 Dec 6 '11 at 20:29

Your Answer


