如何pythonically获得一个numpy argwhere函数的最大值

时间:2014-07-15 12:58:38

标签: python numpy

我想使用numpy argwhere来查找数据中的最大值。下面是一个描述我正在做的事情的示例集:

bins = np.arange(10)
data = np.array([[6],[4],[8],[5]])
np.argwhere(bins<data)

array([[0, 0],
       [0, 1],
       [0, 2],
       [0, 3],
       [0, 4],
       [0, 5],
       [1, 0],
       [1, 1],
       [1, 2],
       [1, 3],
       [2, 0],
       [2, 1],
       [2, 2],
       [2, 3],
       [2, 4],
       [2, 5],
       [2, 6],
       [2, 7],
       [3, 0],
       [3, 1],
       [3, 2],
       [3, 3],
       [3, 4]])

我想从这些数据中得到什么

array([[0,5],
       [1,3],
       [2,7],
       [3,4]])

这可以通过for循环完成,但我想知道是否有更多的pythonic方法来做到这一点。

编辑:

我现在所做的是使用Pandas和groupby。我仍然想知道这是否是最好的方法。

t = pd.DataFrame(np.argwhere(bins<data))
time = t.groupby(0)
time.max()

   1
0   
0  5
1  3
2  7
3  4

现在我有这个,我有一个新问题。假设我有另一组数据:

BigData = np.array([[0,1,2,3,4,5,6,7,8,9],
                   [0,1,2,3,4,5,6,7,8,9],
                   [0,1,2,3,4,5,6,7,8,9],
                   [0,1,2,3,4,5,6,7,8,9]])

如何使用我实现的数组

array([[0,5],
       [1,3],
       [2,7],
       [3,4]])

要放入此新数据以使BigData平均值达到第二列中的索引。即

(0+1+2+3+4) / 5
(0+1+2) / 3
(0+1+2+3+4+5+6) / 7
(0+1+2+3) / 4

将返回BigData,假设我们得到第二列中发生这种情况的索引值。

3 个答案:

答案 0 :(得分:2)

这是一个相当短暂的Numpy解决方案,但也非常快:

A = np.argwhere(bins<data)
print A[np.r_[A[1:,0] != A[:-1,0], True]]

答案 1 :(得分:1)

这是一个NumPy解决方案。它不像Pandas版本那样可读,但时间表明它更快:

>>> arr = np.argwhere(bins<data)
>>> arr[np.where(np.diff(np.vstack((arr, [arr[-1][0]+1, arr[-1][1]])), axis=0)[:,0] > 0)[0]]
array([[0, 5],
       [1, 3],
       [2, 7],
       [3, 4]])
>>> %timeit arr[np.where(np.diff(np.vstack((arr, [arr[-1][0]+1, arr[-1][1]])), axis=0)[:,0] > 0)[0]]
10000 loops, best of 3: 32.7 µs per loop
>>> %%timeit
... t = pd.DataFrame(arr)
... time = t.groupby(0)
... time.max()
... 
1000 loops, best of 3: 1 ms per loop

答案 2 :(得分:1)

以下对我来说似乎相当快,利用argmax左侧工作 - &gt;右:

>>> bins[::-1][(bins[::-1] < data).argmax(axis=1)]
array([5, 3, 7, 4])

对我而言,%timeit表明这需要大约11μs。

但是,操纵数组使索引作为第一列(如下所示)会将时间增加到大约25μs:

>>> np.column_stack(
... [np.arange(data.shape[0]), bins[::-1][(bins[::-1] < data).argmax(axis=1)]])
array([[0, 5],
       [1, 3],
       [2, 7],
       [3, 4]])