是否可以通过一次调用 numpy 获得 numpy.argmin 和 numpy.amin 的结果?谢谢。
请您参考如下方法:
您可以使用 np.argmin 获取对应于最小值的索引,然后将这些索引与 NumPy's advanced indexing 一起使用获得最小值。
让我们用一个2D数组来展示它的用法。设 A 是一个 2D 数组,假设我们有兴趣找到沿 axis=1 的最小索引和值。
因此,我们可以做-
min_idx = np.argmin(A,axis=1)
min_val = A[np.arange(A.shape[0]),min_idx]
让我们用实际的 2D 数组进行示例运行并验证结果 -
In [16]: A
Out[16]:
array([[79, 97, 12, 54, 59],
[44, 45, 42, 78, 32],
[32, 41, 67, 60, 4],
[24, 4, 85, 94, 65]])
In [17]: min_idx = np.argmin(A,axis=1)
In [18]: A[np.arange(A.shape[0]),min_idx] # Using min_idx & indexing
Out[18]: array([12, 32, 4, 4])
In [19]: np.amin(A,axis=1) # Using np.amin to verify
Out[19]: array([12, 32, 4, 4])
运行时测试-
In [26]: def original_app(A):
...: min_idx = np.argmin(A,axis=1)
...: min_val = np.amin(A,axis=1)
...: return min_idx, min_val
...:
...: def proposed_app(A):
...: min_idx = np.argmin(A,axis=1)
...: min_val = A[np.arange(A.shape[0]),min_idx]
...: return min_idx, min_val
...:
In [27]: A = np.random.randint(0,99,(4000,5000))
In [28]: %timeit original_app(A)
10 loops, best of 3: 70.9 ms per loop
In [29]: %timeit proposed_app(A)
10 loops, best of 3: 33.1 ms per loop
让我们进一步剖析时间安排 -
In [31]: min_idx = np.argmin(A,axis=1)
In [32]: %timeit np.argmin(A,axis=1) # Used in both methods
10 loops, best of 3: 34.5 ms per loop
In [33]: %timeit np.amin(A,axis=1) # Original approach
10 loops, best of 3: 37.3 ms per loop
In [34]: %timeit A[np.arange(A.shape[0]),min_idx] # Proposed approach
10000 loops, best of 3: 56 µs per loop
正如我们所看到的,在最后一步使用高级索引带来了重大 yield ,而且花费的运行时间可以忽略不计。这几乎可以减少 100% 的运行时间!
