如何使用索引和值迭代1d NumPy数组

参见英文答案 > Iterate over numpy with index (numpy equivalent of python enumerate)                                    3个
对于python dict,我可以使用iteritems()同时循环键和值.但我找不到NumPy阵列的这种功能.我必须像这样手动跟踪idx:

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

有一个更好的方法吗?

解决方法:

还有一些选择.以下假设您正在迭代1d NumPy数组.

range迭代

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

请注意,这是与numba一起使用的3个解决方案中的the only.这是值得注意的,因为显式地迭代NumPy数组通常仅在与numba或其他预编译方式结合时才有效.

enumerate迭代

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

1d阵列的3种解决方案中效率最高的.请参阅下面的基准测试

np.ndenumerate迭代

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

注意idx [0]中的附加索引步骤.这是必要的,因为1d NumPy数组的索引(如形状)是作为单个元组给出的.对于1d数组,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
上一篇:java – String类中的子串方法到达不应该的索引


下一篇:mysql – 多列上的FULLTEXT INDEXES如何工作?