[Numpy-discussion] weights parameter of np.average() doesn't work (BUG?)

Dan Lenski dlenski@gmail....
Sun Aug 24 21:03:42 CDT 2008


Hi all,
Is there a good reason why the weights parameter of np.average() doesn't 
broadcast properly?  This is with the Ubuntu Hardy x86_64 numpy package, 
version 1.0.4.


In [293]: a=arange(100).reshape(10,10)

# Things work fine when weights have the exact same shape as a

In [297]: average(a, axis=1, weights=ones((10,10)))
Out[297]: array([  4.5,  14.5,  24.5,  34.5,  44.5,  54.5,  64.5,  74.5,  
84.5,  94.5])

# Bizarre and incorrect result with length-10 weight array

In [298]: average(a, axis=1, weights=ones(10))
Out[298]: 
array([[[[[[[[[  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.],
              [ 10.,  11.,  12.,  13.,  14.,  15.,  16.,  17.,  18.,  19.],
              [ 20.,  21.,  22.,  23.,  24.,  25.,  26.,  27.,  28.,  29.],
              [ 30.,  31.,  32.,  33.,  34.,  35.,  36.,  37.,  38.,  39.],
              [ 40.,  41.,  42.,  43.,  44.,  45.,  46.,  47.,  48.,  49.],
              [ 50.,  51.,  52.,  53.,  54.,  55.,  56.,  57.,  58.,  59.],
              [ 60.,  61.,  62.,  63.,  64.,  65.,  66.,  67.,  68.,  69.],
              [ 70.,  71.,  72.,  73.,  74.,  75.,  76.,  77.,  78.,  79.],
              [ 80.,  81.,  82.,  83.,  84.,  85.,  86.,  87.,  88.,  89.],
              [ 90.,  91.,  92.,  93.,  94.,  95.,  96.,  97.,  98.,  99.]
       ]]]]]]]])

Doing the weighted-sum explicitly works fine for me:

In [311]: sum(a*ones(10), axis=-1)/sum(ones(10))
Out[311]: array([  4.5,  14.5,  24.5,  34.5,  44.5,  54.5,  64.5,  74.5,  
84.5,  94.5])

This seems like a bug, especially since average.__doc__ states that:
    If weights are given, result is:
        sum(a * weights,axis) / sum(weights,axis),
    where the weights must have a's shape or be 1D with length the
    size of a in the given axis. Integer weights are converted to
    Float.  Not specifying weights is equivalent to specifying
    weights that are all 1.

Frankly, I don't even see why weights is constrained to be 1D or the same 
shape as a... why not anything that's broadcastable to the same shape as a?

Dan



More information about the Numpy-discussion mailing list