如何使用索引和值迭代一维NumPy数组[重复]

发布于 2021-01-29 15:23:27

这个问题已经在这里有了答案

使用索引迭代numpy(相当于python枚举的numpy) (3个答案)

1年前关闭。

对于python dict,我可以用来iteritems()同时遍历键和值。但是我找不到NumPy数组的这种功能。我必须idx像这样手动跟踪:

idx = 0 
for j in theta:
   some_function(idx,j,theta)
   idx += 1

有一个更好的方法吗?

关注者
0
被浏览
176
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    有几种选择。下面假设您要迭代1d NumPy数组。

    迭代 range

    for j in range(theta.shape[0]):  # or range(len(theta))
       some_function(j, theta[j], theta)
    

    请注意,这是可与一起使用的3种解决方案中的唯一一种numba。这是值得注意的,因为在NumPy数组上进行显式迭代通常仅在与numba预编译组合或其他方式结合时才有效。

    迭代

    enumerate

    for idx, j in enumerate(theta):
       some_function(idx, j, theta)
    

    3维解决方案中最有效的一维阵列。请参阅下面的基准测试。

    迭代

    np.ndenumerate

    for idx, j in np.ndenumerate(theta):
       some_function(idx[0], j, theta)
    

    请注意中的附加索引步骤idx[0]。这是必要的,因为shape1d
    NumPy数组的索引(如)作为单例元组给出。对于一维数组,np.ndenumerate效率不高;它的优势仅表现在多维数组上。

    绩效基准

    # Python 3.7, NumPy 1.14.3
    
    np.random.seed(0)
    
    arr = np.random.random(10**6)
    
    def enumerater(arr):
        for index, value in enumerate(arr):
            index, value
            pass
    
    def ranger(arr):
        for index in range(len(arr)):
            index, arr[index]
            pass
    
    def ndenumerater(arr):
        for index, value in np.ndenumerate(arr):
            index[0], value
            pass
    
    %timeit enumerater(arr)    # 131 ms
    %timeit ranger(arr)        # 171 ms
    %timeit ndenumerater(arr)  # 579 ms
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看