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,
1 Answer 1
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
2 Comments
dtype
. I've edited the post to show what I mean.