[Numpy-discussion] Need a good idea: calculate the mean of many vectors

Robert Kern robert.kern@gmail....
Tue Feb 8 10:32:46 CST 2011


On Tue, Feb 8, 2011 at 09:24, EMMEL Thomas <Thomas.EMMEL@3ds.com> wrote:
> Hi,
>
> here is something I am thinking about for some time and I am wondering
> whether there is a better solution
> within numpy.
>
> The task is:
> I have an array (300000+ entries) with arrays each with length == 3, that is
> initially empty like this:
>
> n = 100 # for test otherwise ~300000
> a1 = reshape(zeros(3*n).astype(float), (n,3))
>
> (Speaking literally this is a field of displacements in a
> Finite-Element-Mesh)
> Now I have a lot of triangles where the corners are the nodes, each with an
> index between 0 and n-1
> and I like to add a unique displacement for all three nodes to a1 like this
>
> a2 = zeros(n).astype(int)
>
> for indices, data in [...]:
>     #data = array((1.,2.,3.))
>     #indices = (1,5,60)
>     for index in indices:
>         a1[index] += data
>         a2[index] += 1
>
> Now after filling a1 and a2 over and over (for a lot of triangles) I can
> finally calculate the
> averaged displacement on all points by this
>
> meand = a1/reshape(a2,(n,1))

Use np.bincount() on each coordinate.

[~]
|10> xyz = np.random.random_sample([10, 3])

[~]
|11> ind = np.array([1,3,4,3,4,5,0,0,1,2])

[~]
|12> sum_xyz = np.column_stack([np.bincount(ind, xyz[:,i]) for i in
range(xyz.shape[1])])

[~]
|13> sum_xyz
array([[ 1.56632447,  0.88193741,  0.20253585],
       [ 1.36661663,  0.98698521,  0.79892009],
       [ 0.26787528,  0.12850502,  0.76042557],
       [ 1.08489219,  0.70099349,  1.56665748],
       [ 0.56662843,  1.3502819 ,  0.15531993],
       [ 0.34900915,  0.34282216,  0.48250042]])

[~]
|14> counts = np.bincount(ind)

[~]
|15> counts
array([2, 2, 1, 2, 2, 1])

[~]
|17> mean_xyz = sum_xyz / counts[:,np.newaxis]

[~]
|18> mean_xyz
array([[ 0.78316224,  0.4409687 ,  0.10126793],
       [ 0.68330832,  0.4934926 ,  0.39946005],
       [ 0.26787528,  0.12850502,  0.76042557],
       [ 0.54244609,  0.35049674,  0.78332874],
       [ 0.28331422,  0.67514095,  0.07765996],
       [ 0.34900915,  0.34282216,  0.48250042]])


Watch out for divisions by 0 when you calculate the mean.

-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless
enigma that is made terrible by our own mad attempt to interpret it as
though it had an underlying truth."
  -- Umberto Eco


More information about the NumPy-Discussion mailing list