[Numpy-discussion] add axis to results of reduction (mean, min, ...)

Keith Goodman kwgoodman at gmail.com
Mon Aug 10 12:21:25 EDT 2009


On Mon, Aug 10, 2009 at 9:10 AM, <josef.pktd at gmail.com> wrote:
> On Mon, Aug 10, 2009 at 11:55 AM, Keith Goodman<kwgoodman at gmail.com> wrote:
>> On Thu, Aug 6, 2009 at 9:07 AM, Robert Kern<robert.kern at gmail.com> wrote:
>>> On Thu, Aug 6, 2009 at 11:03, Keith Goodman<kwgoodman at gmail.com> wrote:
>>>> On Thu, Aug 6, 2009 at 8:55 AM, <josef.pktd at gmail.com> wrote:
>>>>> What's the best way of getting back the correct shape to be able to
>>>>> broadcast, mean, min,.. to the original array, that works for
>>>>> arbitrary dimension and axis?
>>>>>
>>>>> I thought I have seen some helper functions, but I don't find them anymore?
>>>>>
>>>>> Josef
>>>>>
>>>>>>>> a
>>>>> array([[1, 2, 3, 3, 0],
>>>>>       [2, 2, 3, 2, 1]])
>>>>>>>> a-a.max(0)
>>>>> array([[-1,  0,  0,  0, -1],
>>>>>       [ 0,  0,  0, -1,  0]])
>>>>>>>> a-a.max(1)
>>>>> Traceback (most recent call last):
>>>>>  File "<pyshell#135>", line 1, in <module>
>>>>>    a-a.max(1)
>>>>> ValueError: shape mismatch: objects cannot be broadcast to a single shape
>>>>>>>> a-a.max(1)[:,None]
>>>>> array([[-2, -1,  0,  0, -3],
>>>>>       [-1, -1,  0, -1, -2]])
>>>>
>>>> Would this do it?
>>>>
>>>>>> pylab.demean??
>>>> Type:           function
>>>> Base Class:     <type 'function'>
>>>> String Form:    <function demean at 0x3c5c050>
>>>> Namespace:      Interactive
>>>> File:           /usr/lib/python2.6/dist-packages/matplotlib/mlab.py
>>>> Definition:     pylab.demean(x, axis=0)
>>>> Source:
>>>> def demean(x, axis=0):
>>>>    "Return x minus its mean along the specified axis"
>>>>    x = np.asarray(x)
>>>>    if axis:
>>>>        ind = [slice(None)] * axis
>>>>        ind.append(np.newaxis)
>>>>        return x - x.mean(axis)[ind]
>>>>    return x - x.mean(axis)
>>>
>>> Ouch! That doesn't handle axis=-1.
>>>
>>> if axis != 0:
>>>    ind = [slice(None)] * x.ndim
>>>    ind[axis] = np.newaxis
>>
>> Ouch! That doesn't handle axis=None.
>>
>> if axis:
>>    ind = [slice(None)] * x.ndim
>>    ind[axis] = np.newaxis
>
> that's why I used
>
>  if axis != 0 and not axis is None:
>
> and included a testcase for None. (although my version looks a bit
> verbose but explicit)

I'm getting better. I'm only 3 days behind this time.

Yeah, I caught it on a unit test too.



More information about the NumPy-Discussion mailing list