我想使用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,假设我们得到第二列中发生这种情况的索引值。
答案 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]])