微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用索引和值迭代一维NumPy数组

如何解决如何使用索引和值迭代一维NumPy数组

有几种选择。下面假设您要迭代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

解决方法

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

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

有一个更好的方法吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。