[Numpy-discussion] printing structured arrays

Bruce Schultz bruce.schultz at gmail.com
Wed Mar 10 09:06:28 EST 2010



On 10/03/10 10:09, Bruce Schultz wrote:
> On Sat, Mar 6, 2010 at 8:35 AM, Gökhan Sever <gokhansever at gmail.com> wrote:
>   
>> On Fri, Mar 5, 2010 at 8:00 AM, Bruce Schultz <bruce.schultz at gmail.com>
>> wrote:
>>     
>>> Output is:
>>> ### ndarray
>>> [[ 1.   2. ]
>>>  [ 3.   4.1]]
>>> ### structured array
>>> [(1.0, 2.0) (3.0, 4.0999999999999996)]
>>>       
>> I still couldn't figure out how floating point numbers look nicely on screen
>> in cases like yours (i.e., trying numpy.array2string()) but you can make
>> sure by using numpy.savetxt("file", array, fmt="%.1f") you will always have
>> specified precision in the written file.
>>     
>
> Using numpy.array2string() gives the same format as the output above.
>   
I started looking at how array2string() is implemented, and came up with
this patch which formats my structured array nicely, the same as an
unstructured array. It was mainly done as a proof of concept, so it only
works for floats and I'm probably doing the wrong thing to detect a
structured array by comparing the dtype to void.  Maybe someone with
more numpy experience can tell me if I'm on the right track...

=== modified file 'numpy/core/arrayprint.py'
--- numpy/core/arrayprint.py    2010-02-21 16:16:34 +0000
+++ numpy/core/arrayprint.py    2010-03-10 13:48:22 +0000
@@ -219,6 +219,10 @@
         elif issubclass(dtypeobj, _nt.unicode_) or \
                  issubclass(dtypeobj, _nt.string_):
             format_function = repr
+        elif issubclass(dtypeobj, _nt.void):
+            #XXX this is for structured arrays....
+            format_function = StructuredFormatter(a)
+            separator = '\n '
         else:
             format_function = str
 
@@ -231,6 +235,17 @@
 
     return lst
 
+class StructuredFormatter:
+    def __init__(self, a):
+        self.data = a
+        self.dtype = a.dtype  #XXX use the dtype to build column formatters
+
+    def __call__(self, x):
+        ff = FloatFormat(self.data.view(float), _float_output_precision,
+                          _float_output_suppress_small)
+        return '[' + ' '.join([ff(n) for n in x]) + ']'
+
+   
 def _convert_arrays(obj):
     import numeric as _nc
     newtup = []



Cheers
Bruce

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20100311/15c23d4d/attachment.html>


More information about the NumPy-Discussion mailing list