Calculate mean of array with specific value from another array
<p>I have these numpy arrays:</p>

<pre><code>array1 = np.array([-1, -1, 1, 1, 2, 1, 2, 2])
array2 = np.array([34.2, 11.2, 22.1, 78.2, 55.0, 66.87, 33.3, 11.56])
</code></pre>

<p>Now I want to return a 2d array in which there is the mean for each distinctive value from array1 so my output would look something like this:</p>

<pre><code>array([[-1, 22.7],
       [ 1, 55.7],
       [ 2, 33.3]])
</code></pre>

<p>Is there an efficient way without concatenating those 1D arrays to one 2D array? Thanks!</p>

<p>Here's an approach using <a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.unique.html" rel="nofollow"><code>np.unique</code></a> and <a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.bincount.html" rel="nofollow"><code>np.bincount</code></a>  -</p>

<pre><code># Get unique array1 elems, tag them starting from 0 and get their tag counts
unq,ids,count = np.unique(array1,return_inverse=True,return_counts=True)

# Use the tags/IDs to perform ID based summation of array2 elems and 
# thus divide by the ID counts to get ID based average values
out = np.column_stack((unq,np.bincount(ids,array2)/count))
</code></pre>

<p>Sample run -</p>

<pre><code>In [16]: array1 = np.array([-1, -1, 1, 1, 2, 1, 2, 2])
    ...: array2 = np.array([34.2, 11.2, 22.1, 78.2, 55.0, 66.87, 33.3, 11.56])
    ...: 

In [18]: out
Out[18]: 
array([[ -1.        ,  22.7       ],
       [  1.        ,  55.72333333],
       [  2.        ,  33.28666667]])
</code></pre>

python arrays performance numpy