# [Python-modules-team] Bug#467095: python-numpy: numpy.average() returns the wrong result with weights.

Greg Kochanski gpk at kochanski.org
Sat Feb 23 00:08:21 UTC 2008

```Package: python-numpy
Version: 1:1.0.4-5
Severity: normal

>>> x = numpy.array([[1,2,3,4,5,6,2],[2,2,3,4,5,6,3]]).transpose()
>>> wt = numpy.array([1,1,1,1,1,1,2])
>>> numpy.average(x, weights=wt, axis=0)
array([[[[[[ 1.,  2.],
[ 2.,  2.],
[ 3.,  3.],
[ 4.,  4.],
[ 5.,  5.],
[ 6.,  6.],
[ 2.,  3.]]]]]])

So, the weighted average of a 2-dimentional array is a 6-dimensional
array?

Or, slightly better:
>>> x = numpy.array([range(100),range(100)]).transpose()
>>> wt = numpy.array(range(100))
>>> numpy.average(x, weights=wt, axis=0)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/usr/local/lib/python2.4/site-packages/numpy-1.0.4-py2.4-linux-i686.egg/numpy/lib/function_base.py", line 379, in average
w1 = eval("w["+repr(tuple(r))+"]*ones(ash, float)")
File "<string>", line 0, in ?
IndexError: too many indices
>>>

The problem seems to be in .../numpy/lib/function_base.py
right here:

if wsh == ():
wsh = (1,)
if wsh == ash:
n = add.reduce(a*w, axis)
d = add.reduce(w, axis)
elif wsh == (ash[axis],):
# ni = len(ash)		#CORRECT!
ni = ash[axis]		# WRONG!
r = [newaxis]*ni
r[axis] = slice(None, None, 1)
w1 = eval("w["+repr(tuple(r))+"]*ones(ash, float)")
n = add.reduce(a*w1, axis)
d = add.reduce(w1, axis)
else:
raise ValueError, 'averaging weights have wrong shape'

The existing code generates an array whose dimensionality is
equal to shape[axis], so it you have a 2-dimensional array
with a shape of (1000,3), it will try to generate a 1000-dimensional
array on the output.

And, Geez!  Calling eval() in code that is supposed to be fast?
Yikes!  (But that's a separate issue...)

-- System Information:
Debian Release: lenny/sid
APT prefers testing
APT policy: (500, 'testing')
Architecture: i386 (i686)

Kernel: Linux 2.6.22-3-686 (SMP w/1 CPU core)
Locale: LANG=en_GB, LC_CTYPE=en_GB (charmap=ISO-8859-1)
Shell: /bin/sh linked to /bin/bash

Versions of packages python-numpy depends on:
ii  atlas3-base [liblapack 3.6.0-20.6        Automatically Tuned Linear Algebra
ii  atlas3-sse2 [liblapack 3.6.0-20.6        Automatically Tuned Linear Algebra
ii  lapack3 [liblapack.so. 3.0.20000531a-6.1 library of linear algebra routines
ii  libc6                  2.7-6             GNU C Library: Shared libraries
ii  libg2c0                1:3.4.6-6         Runtime library for GNU Fortran 77
ii  libgcc1                1:4.3-20080202-1  GCC support library
ii  python                 2.4.4-6           An interactive high-level object-o
ii  python-support         0.7.6             automated rebuilding support for p
ii  refblas3 [libblas.so.3 1.2-8             Basic Linear Algebra Subroutines 3

python-numpy recommends no packages.

-- no debconf information

```

More information about the Python-modules-team mailing list