<p>如果我正确理解你的问题,我们能做什么。就是把观测值加起来,除以2就会得到与中值对应的观测值。从那里我们需要弄清楚这个数字是什么样的观测值。</p>
<p>这里的一个技巧是用np.cumsum计算观测和。这给了我们一个连续的累积和。</p>
<p>示例:<br/>
<code>np.cumsum([1,2,3,4]) -> [ 1, 3, 6, 10]</code><br/>
每个元素都是所有先前元素和自身的总和。我们这里有10个观察点。所以平均值是第5次观察。(最后一个元素除以2得到5)。<br/>
现在看一下cumsum结果,我们可以很容易地看到,这一定是第二个和第三个元素之间的观测(观测3和6)。</p>
<p>所以我们需要做的就是找出中位数(5)的指数。<br/>
<a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.searchsorted.html" rel="nofollow">np.searchsorted</a>正是我们所需要的。它将找到将元素插入数组的索引,以便保持排序。</p>
<p>这样做的代码如下:</p>
<pre><code>import numpy as np
#my test data
freq_count = np.array([[30, 191, 9, 0], [10, 20, 300, 10], [10,20,30,40], [100,10,10,10], [1,1,1,100]])
c = np.cumsum(freq_count, axis=1)
indices = [np.searchsorted(row, row[-1]/2.0) for row in c]
masses = [i * 10 for i in indices] #Correct if the masses are indeed 0, 10, 20,...
#This is just for explanation.
print "median masses is:", masses
print freq_count
print np.hstack((c, c[:, -1, np.newaxis]/2.0))
</code></pre>
<p>输出为:</p>
<pre><code>median masses is: [10 20 20 0 30]
[[ 30 191 9 0] <- The test data
[ 10 20 300 10]
[ 10 20 30 40]
[100 10 10 10]
[ 1 1 1 100]]
[[ 30. 221. 230. 230. 115. ] <- cumsum results with median added to the end.
[ 10. 30. 330. 340. 170. ] you can see from this where they fit in.
[ 10. 30. 60. 100. 50. ]
[ 100. 110. 120. 130. 65. ]
[ 1. 2. 3. 103. 51.5]]
</code></pre>