Re: Numpy Array printing algorithms
Thanks Tony, that was very informative! Particularly the bit about lookahead for alignment. But, since I presumably don't want to litter all my docstrings with `np.set_printoptions` statements, it's not useful to my usecase, since I need to be able to predict the "standard" output from numpy. In my case, there are definitely no values > 100 in that array, so the two spaces are superfluous. Ech. On Tue, Jun 3, 2014 at 3:58 PM, Tony Yu <tsyu80@gmail.com> wrote:
On Tue, Jun 3, 2014 at 12:00 AM, Juan NunezIglesias <jni.soma@gmail.com> wrote:
Hi All,
This is more suited for a numpy list but thought I'd try the home crowd first. Does anyone know how numpy decides to print arrays? It is a pain getting doctests to pass without knowing the system. Example:
In [15]: lifio.parse_series_name(name2)[1][:5] Out[15]: array([ 63. , 63.5, 64. , 64.5, 65. ])
In [16]: lifio.parse_series_name(name2, 1)[1][:5] Out[16]: array([ 63., 64., 65., 66., 67.])
Note:
It goes 63.<space>,<spacespace>63.5,<spacespace>64.<space> etc. Note also the space after the opening brace but not the closing brace. Basically, you can't go by PEP8, so it's a pain predicting what the actual printout is going to be. I get the space after the . so that the .5's will align, but what about the leading spaces?
Juan.
Part of what you're looking for is set by `np.set_printoptions`. For example, you can write something like
In [31]: np.set_printoptions(formatter={'all': lambda x: '{}'.format(x)}, precision=3)
In [32]: a Out[32]: array([10.0, 10.5, 11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 14.5, 15.0, 15.5, 16.0, 16.5, 17.0, 17.5, 18.0, 18.5, 19.0, 19.5, 20.0])
In [33]: print a [10.0 10.5 11.0 11.5 12.0 12.5 13.0 13.5 14.0 14.5 15.0 15.5 16.0 16.5 17.0 17.5 18.0 18.5 19.0 19.5 20.0]
Note that `repr` adds commas after values (and the `array(` prefix), while `str` doesn't. There's some magic in the default formatter that I haven't dug into. Somehow, it's able to read all the values beforehand so that it can determine the maximum width needed to align values. So for example, you might write this
In [38]: a = np.array([1, 10, 100, 1000])
and get this as output
In [39]: print a [1 10 100 1000]
But what you really wanted was this
In [40]: np.set_printoptions(formatter={'all': lambda x: '{:4}'.format(x)}, precision=3)
In [41]: print a [ 1  10  100 1000]
Ideally that `{:4}` could be determined after looking at the entire array. That part is a bit of a mystery to me.
 You received this message because you are subscribed to the Google Groups "scikitimage" group. To unsubscribe from this group and stop receiving emails from it, send an email to scikitimage+unsubscribe@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
participants (1)

Juan NunezIglesias