numpy - 2D matrix/array - initialization like in Matlab...

Marco Nawijn nawijn at gmail.com
Tue Oct 16 06:34:45 EDT 2012


On Tuesday, October 16, 2012 12:43:09 AM UTC+2, someone wrote:
> On 10/15/2012 11:26 PM, MRAB wrote:
> 
> > On 2012-10-15 22:09, someone wrote:
> 
> >>
> 
> >> See this:
> 
> >>
> 
> >> ==========================================================
> 
> >> In [5]: Dx = numpy.matrix('1 0 0; 0 0.5 -0.5; 0 -0.5 1.5')
> 
> >>
> 
> >> In [6]: Dx
> 
> >> Out[6]:
> 
> >> matrix([[ 1. ,  0. ,  0. ],
> 
> >>           [ 0. ,  0.5, -0.5],
> 
> >>           [ 0. , -0.5,  1.5]])
> 
> >> ==========================================================
> 
> >>
> 
> >>
> 
> >>
> 
> >> Ok... So now test = 33 and instead of the value 1.5 I want to use the
> 
> >> value of "test" and put it directly into the matrix (or array):
> 
> >>
> 
> >> ==========================================================
> 
> >> In [7]: test=33
> 
> >>
> 
> >> In [8]: Dx = numpy.matrix('1 0 0; 0 0.5 -0.5; 0 -0.5 test')
> 
> >> ---------------------------------------------------------------------------
> 
> >>
> 
> >> NameError                                 Traceback (most recent call
> 
> >> last)
> 
> >> /home/user/something/<ipython-input-8-5a43575649e1> in <module>()
> 
> >> ----> 1 Dx = numpy.matrix('1 0 0; 0 0.5 -0.5; 0 -0.5 test')
> 
> >>
> 
> >> /usr/lib/python2.7/dist-packages/numpy/matrixlib/defmatrix.pyc in
> 
> >> __new__(subtype, data, dtype, copy)
> 
> >>       252
> 
> >>       253         if isinstance(data, str):
> 
> >> --> 254             data = _convert_from_string(data)
> 
> >>       255
> 
> >>       256         # now convert data to an array
> 
> >> ...... etc...
> 
> >> ==========================================================
> 
> >>
> 
> >>
> 
> >>
> 
> >> So obviously it doesn't understand that I want this:
> 
> >>
> 
> >> ==========================================================
> 
> >> In [21]: Dx[2,2]=test
> 
> >>
> 
> >> In [22]: Dx
> 
> >> Out[22]:
> 
> >> matrix([[  1. ,   0. ,   0. ],
> 
> >>           [  0. ,  33. ,  -0.5],
> 
> >>           [  0. ,  -0.5,  33. ]])
> 
> >> ==========================================================
> 
> >>
> 
> >> Without having to manually change all the individual places using my
> 
> >> variables (test is actually many variables, not just one but I think you
> 
> >> should understand the problem now).
> 
> >>
> 
> >>
> 
> >> How to initialize my array directly using variables ?
> 
> >>
> 
> >> It could also be that I wanted:
> 
> >>
> 
> >> test11 = 1
> 
> >> test12 = 1.5
> 
> >> test13 = 2
> 
> >> test21 = 0
> 
> >> test22 = 5
> 
> >>
> 
> >> Dx = numpy.matrix('test11 test12 test13; test21 test22 -0.5; 0 -0.5 1.5')
> 
> >>
> 
> >> Etc... for many variables...
> 
> >>
> 
> >> Appreciate ANY help, thank you very much!
> 
> >>
> 
> > What it prints should give you a hint:
> 
> >
> 
> >  >>> Dx = numpy.matrix([[test11, test12, test13], [test21, test22,
> 
> > -0.5], [0, -0.5, 1.5]])
> 
> >  >>> Dx
> 
> > matrix([[ 1. ,  1.5,  2. ],
> 
> >          [ 0. ,  5. , -0.5],
> 
> >          [ 0. , -0.5,  1.5]])
> 
> 
> 
> Uh, great - thank you very much!
> 
> 
> 
> As you maybe see, I'm only a python newbie so I'm not so good at 
> 
> understanding the error messages and reading the source code yet.
> 
> 
> 
> Thank you very much for the solution to the problem! It's highly 
> 
> appreciated. Thanks.

Hi,

Also note that you don't need to initialize the array with a string. You could directly do it like this:

>>> a = numpy.array(((1,2,3), (2,3,4), (4,5,6)))

Other things that might be interesting for you are:

# List comprehension (standard python) to convert strings to floats
>>> vals = [ float(s) for s in "1.0 2.3 1.2".split() ]
produces [1.0, 2.3, 1.2]
>>> vals = [ float(s) for s in ("1.0", "2.3", "1.2") ]
produces again [1.0, 2.3, 1.2]

Also lookup the documentation for numpy.reshape. With this you could provide a single list of for example 9 numbers and reshape it into a 3x3 array.

Python and Numpy are so cool!!

Marco



More information about the Python-list mailing list