8

I understood simple concepts about comma operator in Python. For instance,

x0, sigma = 0, 0.1

means x0 = 0 and sigma = 0.1. But I obtained some code that has a line that looks like the following,

y, xe = np.histogram(np.random.normal(x0, sigma, 1000))

where the output of y and xe are the following:

y
Out[10]: array([  3,  17,  58, 136, 216, 258, 189,  87,  31,   5], dtype=int64)

xe
Out[11]: 
array([-0.33771565, -0.27400243, -0.21028922, -0.146576  , -0.08286279,
       -0.01914957,  0.04456364,  0.10827686,  0.17199007,  0.23570329,
        0.2994165 ])

I am not sure how to read the y, xe expression. What could I look up to understand what it's saying?

1
  • Answerers, please be aware that the question is not about the x0, sigma = 0, 0.1 line. It's about the y, xe = np.histogram(np.random.normal(x0, sigma, 1000)) line. Commented Aug 8, 2017 at 17:44

4 Answers 4

15

x0, sigma = 0, 0.1 is syntactic sugar. Some stuff is happening behind the scenes:

  • 0, 0.1 implicitly creates a tuple of two elements.

  • x0, sigma = unpacks that tuple into those two variables.

If you look at the docs for numpy.histogram, you see that it returns these two things:

hist : array
The values of the histogram. See density and weights for a description of the possible semantics.

bin_edges : array of dtype float
Return the bin edges (length(hist)+1).

Your y, xe = ... unpacks the tuple of the two returned arrays respectively. That is why your y is assigned to a numpy int64 array and your xe assigned to a numpy float array.

Sign up to request clarification or add additional context in comments.

2 Comments

Actually x0, sigma = 0, 0.1 doesn't even create the tuples - that's one of the few cases where Python optimizes the code (and avoids creating the tuples). However Python "could" create the tuples and that it doesn't is an "implementation detail" if I remember correctly.
@MSeifert Yeah, I could imagine something like that would be optimized by removing the overhead of creating a new tuple only if it is going to be assigned via unpacking. Never looked too deep into that though :P
11

A comma forms a tuple, which in Python looks just like an immutable list.

Python does destructuring assignment, found in a few other languages, e.g. modern JavaScript. In short, a single assignment can map several left-hand variables to the same number of right-hand values:

foo, bar = 1, 2

This is equivalent to foo = 1 and bar = 2 done in one go. This can be used to swap values:

a, b = b, a

You can use a tuple or a list on the right side, and it will be unpacked (destructured) the same way if the length matches:

a, b = [1, 2]
# same effect as above:
xs = [1, 2]
a, b = xs
# again, same effect using a tuple:
ys = 1, 2
a, b = ys

You can return a tuple or a list from a function, and destructure the result right away:

def foo():
  return (1, 2, 3)  # Parens just add readability

a, b, c = foo()  # a = 1; b = 2; c = 3

The histogram function returns a 2-tuple which is unpacked.

Comments

0

Your question reduces to: what is returned when function np.histogram is called, and how they are unpacked into two variables?

Assignment involving commas on the left-hand side is often known as parallel assignment. If the right-hand side of the assignment is a single variable (e.g. a list or tuple), the feature is called unpacking assignment.

In your case np.histogram returns a tuple of two elements (both are arrays), and then the tuple is unpacked to two variables, y and xe.

Comments

-1

This might be a solution for you:

def func():
    return 'a', 3, (1,2,3)  # returns a tuple of 3 elements (str, int, tuple)

x1, x2, x3 = func()  # unpacks the tuple of 3 elements into 3 vars
# x1: 'a'
# x2: 3
# x3: (1,2,3)

1 Comment

This is a good illustration, but you need to explain what is happening and why it works.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.