One of the complaints I've heard about Python from Matlab developers is that the error messages can be cryptic.
Here's an example of an error I recently got while running some Python code (see Error Message below). When compared with a Matlab-style error, this can be a bit overwelming. Here's a few tips:
- Start at the bottom. That will be where the actual error message is. In this case it's "ValueError: to_rgba: Invalid rgba arg "['#eeeeee']" need more than 1 value to unpack". Notice that the argument in question is inside of square brackets - that means it's a list with 1 item in it. Perhaps that's telling.
- Find where the code you wrote is breaking. Often the stack of errors is deep inside some other module or code, but what you wrote is actually passing in bad data. The 2nd block of errors starting with "<ipython-input-2-2a6f1bb6961e>" is code that we wrote. Looks like the offending line is "color = colors_bmh[ y[ix].astype(int) ]". Somehow we're setting the array of "color" to some bad values.
- Look at the specific error message, "ValueError: ... need more than 1 value to unpack". This means that the code was expecting 2 or more values to be returned but only 1 was.
It actually took me a while to debug the code. In this case, the point I made under Step 1 above about the square brackets (indicating a list) around the argument was the key. The colors array was defined this way:
color = colors_bmh[ y[ix].astype(int) ]
The problem with that statement is that if you look at the array shape, (np.shape(color)) it's 2-dimensional (100,1) whereas the function was expecting a list, or a 1-Dimensional array. Changing the code to this fixed it:
color = colors_bmh[ y[ix].astype(int) ].ravel()
The ravel() method removes singleton dimensions. It's similar to Matlab's squeeze() function. Hope that helps!
Error Message:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-4-808bb77074e6> in <module>()
3 p = np.random.randn(len(y))
4
----> 5 separation_plot(p,y)
<ipython-input-2-2a6f1bb6961e> in separation_plot(p, y, **kwargs)
29 bars = ax.bar( np.arange(n), np.ones(n), width=1.,
30 color = colors_bmh[ y[ix].astype(int) ],
---> 31 edgecolor = 'none')
32 ax.plot( np.arange(n), p[ix,i], "k",
33 linewidth = 3.,drawstyle="steps-post" )
/Users/william/anaconda/lib/python2.7/site-packages/matplotlib/axes.pyc in bar(self, left, height, width, bottom, **kwargs)
4976 color = [None] * nbars
4977 else:
-> 4978 color = list(mcolors.colorConverter.to_rgba_array(color))
4979 if len(color) == 0: # until to_rgba_array is changed
4980 color = [[0, 0, 0, 0]]
/Users/william/anaconda/lib/python2.7/site-packages/matplotlib/colors.pyc in to_rgba_array(self, c, alpha)
409 result = np.zeros((nc, 4), dtype=np.float)
410 for i, cc in enumerate(c):
--> 411 result[i] = self.to_rgba(cc, alpha)
412 return result
413
/Users/william/anaconda/lib/python2.7/site-packages/matplotlib/colors.pyc in to_rgba(self, arg, alpha)
363 except (TypeError, ValueError) as exc:
364 raise ValueError(
--> 365 'to_rgba: Invalid rgba arg "%s"\n%s' % (str(arg), exc))
366
367 def to_rgba_array(self, c, alpha=None):
ValueError: to_rgba: Invalid rgba arg "['#eeeeee']"
need more than 1 value to unpack