2

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:

np.array(A)

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,

asked Nov 26, 2011 at 1:57

1 Answer 1

3

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:

m=np.matrix(A,dtype='(2,)object')

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 = [(interval.interval([2,3]), interval.interval([0,1])),
 (interval.interval([1,2]), interval.interval([2,3]))]
a = np.empty((2,2),dtype='object')
a[:]=A

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]),
 interval.interval([6,7])]
b = np.empty(2,dtype='object')
b[:]=bd
answered Nov 26, 2011 at 2:46

2 Comments

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?
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.

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.