Skip to main content
 首页 » 编程设计

python之同时有效地获取 numpy.argmin 和 numpy.amin

2025年05月04日15webabcd

是否可以通过一次调用 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% 的运行时间!