On 06/17/2011 08:51 AM, Olivier Delalleau wrote:


2011/6/17 Bruce Southey <[email protected] <mailto:[email protected]>>

    On 06/17/2011 08:22 AM, gary ruben wrote:
    > Thanks Olivier,
    > Your suggestion gets me a little closer to what I want, but doesn't
    > quite work. Replacing the conversion with
    >
    > c = lambda x:np.cast[np.complex64](complex(*eval(x)))
    > b = np.genfromtxt(a,converters={0:c, 1:c, 2:c,
    > 3:c},dtype=None,delimiter=18,usecols=range(4))
    >
    > produces
    >
    > [[(-3.97000002861-5.03999996185j) (-1.1318000555-2.56929993629j)
    >   (-4.60270023346-0.142599999905j) (-1.42490005493+1.73300004005j)]
    >   [(-5.4797000885+0j) (1.85850000381-1.5501999855j)
    >   (4.41450023651-0.763800024986j) (-0.480500012636-1.19760000706j)]
    >   [0j (6.26730012894+0j) (-0.45039999485-0.0289999991655j)
    >   (-1.34669995308+1.65789997578j)]
    >   [0j 0j (-3.5+0j) (2.56189990044-3.37080001831j)]]
    >
    > which is not yet an array of complex numbers. It seems close to the
    > solution though.
    >
    > Gary
    >
    > On Fri, Jun 17, 2011 at 8:40 PM, Olivier Delalleau<[email protected]
    <mailto:[email protected]>>  wrote:
    >> If I understand correctly, your error is that you convert only
    the second
    >> column, because your converters dictionary contains a single
    key (1).
    >> If you have it contain keys from 0 to 3 associated to the same
    function, it
    >> should work.
    >>
    >> -=- Olivier
    >>
    >> 2011/6/17 gary ruben<[email protected]
    <mailto:[email protected]>>
    >>> I'm trying to read a file containing data formatted as in the
    >>> following example using genfromtxt and I'm doing something
    wrong. It
    >>> almost works. Can someone point out my error, or suggest a simpler
    >>> solution to the ugly converter function? I thought I'd leave
    in the
    >>> commented-out line for future reference, which I thought was a
    neat
    >>> way to get genfromtxt to show what it is trying to pass to the
    >>> converter.
    >>>
    >>> import numpy as np
    >>> from StringIO import StringIO
    >>>
    >>> a = StringIO('''\
    >>>   (-3.9700,-5.0400) (-1.1318,-2.5693) (-4.6027,-0.1426)
    (-1.4249, 1.7330)
    >>>   (-5.4797, 0.0000) ( 1.8585,-1.5502) ( 4.4145,-0.7638)
    (-0.4805,-1.1976)
    >>>   ( 0.0000, 0.0000) ( 6.2673, 0.0000) (-0.4504,-0.0290)
    (-1.3467, 1.6579)
    >>>   ( 0.0000, 0.0000) ( 0.0000, 0.0000) (-3.5000, 0.0000) (
    2.5619,-3.3708)
    >>> ''')
    >>>
    >>> #~ b = np.genfromtxt(a,converters={1:lambda
    >>> x:str(x)},dtype=object,delimiter=18)
    >>> b = np.genfromtxt(a,converters={1:lambda
    >>> x:complex(*eval(x))},dtype=None,delimiter=18,usecols=range(4))
    >>>
    >>> print b
    >>>
    >>> --
    >>>
    >>> This produces
    >>> [ (' (-3.9700,-5.0400)', (-1.1318-2.5693j), '
    (-4.6027,-0.1426)', '
    >>> (-1.4249, 1.7330)')
    >>>   (' (-5.4797, 0.0000)', (1.8585-1.5502j), ' ( 4.4145,-0.7638)', '
    >>> (-0.4805,-1.1976)')
    >>>   (' ( 0.0000, 0.0000)', (6.2673+0j), ' (-0.4504,-0.0290)', '
    (-1.3467,
    >>> 1.6579)')
    >>>   (' ( 0.0000, 0.0000)', 0j, ' (-3.5000, 0.0000)', ' (
    2.5619,-3.3708)')]
    >>>
    >>> which I just need to unpack into a 4x4 array, but I get an
    error if I
    >>> try to apply a different view.
    >>>
    >>> thanks,
    >>> Gary
    >>> _______________________________________________
    >>> NumPy-Discussion mailing list
    >>> [email protected] <mailto:[email protected]>
    >>> http://mail.scipy.org/mailman/listinfo/numpy-discussion
    >>
    >> _______________________________________________
    >> NumPy-Discussion mailing list
    >> [email protected] <mailto:[email protected]>
    >> http://mail.scipy.org/mailman/listinfo/numpy-discussion
    >>
    >>
    > _______________________________________________
    > NumPy-Discussion mailing list
    > [email protected] <mailto:[email protected]>
    > http://mail.scipy.org/mailman/listinfo/numpy-discussion
    Just an observation for the StringIO object, you have multiple spaces
    within the parentheses but, by default, you are using whitespace
    delimiters in genfromtxt. So, yes, genfromtxt is going have issues.

    If you can rewrite the input, then you need a non-space and non-comma
    delimiter then specify that delimiter to genfromtxt. Otherwise you are
    probably going to have to write you own parser - for each line,
    split on
    ' (' etc.

    Bruce


It's funny though because that part (the parsing) actually seems to work.

However I've been playing a bit with his example and indeed I can't get numpy to return a complex array. It keeps resulting in an "object" dtype. The only way I found was to convert it temporarily into a list to recast it in complex64, adding the line:
  b = np.array(map(list, b), dtype=np.complex64)

-=- Olivier


_______________________________________________
NumPy-Discussion mailing list
[email protected]
http://mail.scipy.org/mailman/listinfo/numpy-discussion
Yes, my mistake as I did not see that the delimiter was set to 18.
The problem is about the conversion into complex which I do not think is the converter per se. So a brute force way is:

b= np.genfromtxt(a, dtype=str,delimiter=18)
nrow, ncol=b.shape
print b
d=np.empty((nrow, ncol), dtype=np.complex)
for row in range(nrow):
    for col in range(ncol):
        d[row][col]=complex(*eval(b[row][col]))
print d


Bruce
_______________________________________________
NumPy-Discussion mailing list
[email protected]
http://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to