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

Pauli Virtanen pav@iki...
Tue Feb 8 10:33:42 CST 2011

```Tue, 08 Feb 2011 15:24:10 +0000, EMMEL Thomas wrote:
[clip]
> n = 100 # for test otherwise ~300000
> a1 = reshape(zeros(3*n).astype(float), (n,3))
>
> 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

You can (mis-)use `bincount` to vectorize summations.
Bincount does not support broadcasting and takes only 1-D
inputs, so some manual shape manipulation is necessary.

Something probably could/should be done to optimize Numpy's
performance for small arrays.

----

import numpy as np

n = 100  # 100 nodes
m = 1000 # 1000 triangles

# synthetic data

tri_nodes = np.random.randint(0, n, size=(m, 3))
tri_data = np.random.rand(m, 3)

# vectorize sums via bincount

a1 = np.zeros((n,3), float)
a2 = np.bincount(tri_nodes.ravel())

for j in range(3):
# repeat(..., 3) -> the same (3,) data vector is added to each
# node in the triangle
a1[:,j] = np.bincount(tri_nodes.ravel(), np.repeat(tri_data[:,j], 3))

```